Laden...

Null Reference Exception in Where Klausel mit LINQ

Erstellt von der_sharky vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.710 Views
D
der_sharky Themenstarter:in
23 Beiträge seit 2017
vor 4 Jahren
Null Reference Exception in Where Klausel mit LINQ

verwendetes Datenbanksystem: <SQL SERVER 2014>

Hallo zusammen,

ich programiere gerade eine Anwendung, die Daten mittels EF und LINQ bearbeiten soll.
Das Problem was ich habe befindet sich in der in der LINQ Abfrage arInvArea

Weiß jemanden wie man eine solche Exception abfangen kann?
Muss ich davor irgendwie checken ob null Werte gibt und dann die Abfrage ausführen oder wie geht das. Vielen Dank für die Antworten


private ObjectContactsRow CreateNewRow(AreaInventory arInv)
        {

         // Hier bekomme ich die Exception. WithSwimmingPool ist vom Typ Boolen
         var arInvArea = arInv.Area.Where(p => p.WithSwimmingPool).Select(p => p.Units(ReportDate)).FirstOrDefault();



            return new ObjectContactsRow()
            {
                areaSize =  arInvArea  
            };
        }



public class ObjectContactsRow 
    {

        public double areaSize { get; set; }

        public override object[] GetExcelRow()
        {        
            var index = 0;

            Row[index++] = areaSize;

            return Row;
        }
    }

5.657 Beiträge seit 2006
vor 4 Jahren

So könntest du es lösen:


var arInvArea = arInv.Area
    .Where(p => p != null)
    .Where(p => p.WithSwimmingPool)
    .Select(p => p.Units(ReportDate))
    .FirstOrDefault();

Evtl. ist aber auch ReportDate null, und der Fehler tritt in der Units-Methode auf. Das könntest du dann außerhalb der Linq-Abfrage auf null testen. Genauere Infos dazu findest du im StackTrace der Exception.

[FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt

Weeks of programming can save you hours of planning

D
der_sharky Themenstarter:in
23 Beiträge seit 2017
vor 4 Jahren

Hallo MrSparkle,
danke dir für die Hilfe. Leider bekomme ich noch gleicher Fehler.
Beim debuggen mit ReSharper habe ich folgendes Problem angezeigt bekommen:

p.IstQuadratmeter=error CS0103: Der Name "p" ist im aktuellen Kontext nicht vorhanden.

und

p =error CS0103: Der Name "p" ist im aktuellen Kontext nicht vorhanden.

T
2.219 Beiträge seit 2008
vor 4 Jahren

Dann zeig mal deinen aktuellen Code wo der Fehler auftritt.
Kann eigentlich nur sein, dass du die where nicht richtig umgesetzt hast, da p dort eindeutig in der anonymen Methode definiert wird.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

T
461 Beiträge seit 2013
vor 4 Jahren

Hallo,

wie wäre es mit dieser Variante:


var arInvArea = arInv.Area.FirstOrDefault(p => p != null && p.WithSwimmingPool)?.Select(p => p.Units(ReportDate));

Um solche Fehler leichter zu finden, sollte man mal diese Queries extra ausführen:


var arInvAreaObject = arInv.Area.FirstOrDefault(p => p != null && p.WithSwimmingPool);
if(arInvAreaObject != null)
{
    var arInvArea = arInvAreaObject.Units(ReportDate);
    if(arInvArea == wasauchimmer)
    {

    }
}

Schöne Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

16.807 Beiträge seit 2008
vor 4 Jahren

Dein Query macht inhaltlich jetzt aber etwas völlig anderes als der ursprüngliche Query.

T
461 Beiträge seit 2013
vor 4 Jahren

Hallo,

also dieses hier:


var arInvArea = arInv.Area.FirstOrDefault(p => p != null && p.WithSwimmingPool)?.Select(p => p.Units(ReportDate));

ist Schwachsinn, kann nicht funktionieren.
->


double? arInvArea = arInv.Area.FirstOrDefault(p => p != null && p.WithSwimmingPool)?.Units(ReportDate);

.

dieses:


var arInvAreaObject = arInv.Area.FirstOrDefault(p => p != null && p.WithSwimmingPool);
if(arInvAreaObject != null)
{
    var arInvArea = arInvAreaObject.Units(ReportDate);
    if(arInvArea == wasauchimmer)
    {

    }
}

dagegen liefert ja im Prinzip dasselbe Ergebnis wie vom TE mit dem Unterschied, daß nicht die kompletten Areas durchgeschliffen werden müssen usw...


 var arInvArea = arInv.Area.Where(p => p.WithSwimmingPool).Select(p => p.Units(ReportDate)).FirstOrDefault();

nach dem 'Select' bekommt er ein IEnumerable<double> zurück und nimmt danach einfach den ersten Eintrag.

Bei mir dagegen selektiert er sofort nur den ersten Eintrag und gibt dann das Ergebnis zurück.

Oder hab ich was übersehen?

Klar, der Aufbau ist anders aber geht es nicht um das Ergebnis?
Zumindest wäre mein Gedanke mit dem anderen Aufbau soweit gesehen, daß er den Fehler leichter finden könne...

[Edit1]Hab mal bei mir die Typen laut TE korrigiert, das naming brachte mich ein wenig durcheinander... und ich persönlich mag keine 'var'... 😉[/Edit2]

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

16.807 Beiträge seit 2008
vor 4 Jahren

Ich sag nicht, dass er falsch ist; er macht nur was anderes.

Seiner:

  • Über alle Einträge filtern
  • Auf alle Treffer Units() ausführen
  • ersten Treffer nehmen

Deiner:

  • Filtern und ersten Treffer nehmen
  • Units() auf ersten Treffer ausführen

Deiner macht durchaus mehr Sinn

5.657 Beiträge seit 2006
vor 4 Jahren

Im Stacktrace der Exception sieht man doch, wo genau der Fehler auftritt. Entweder direkt im Query oder in der Methode, die aus dem Query aufgerufen wird. Ohne diese Information können wir aber nur spekulieren...

Weeks of programming can save you hours of planning

3.003 Beiträge seit 2006
vor 4 Jahren

MrSparkle hat völlig Recht, wir können nur spekulieren. Wie du den Übeltäter findest, ist im oben verlinkten FAQ-Artikel erläutert. Kurzfassung:

(VS 2017 und höher)
Debuggen -> Fenster -> Ausnahmeeinstellungen (Strg+Alt+E)
Haken setzen zweite Checkbox von oben (Common Language Runtime Exceptions)
F5 und bis zur Ausnahme arbeiten -> VS hält an, sobald ein Fehler passiert
mit der Maus über die in Frage kommenden Elemente und schauen, was null ist, oder das Fenster "lokal" im Auge behalten

Zeitaufwand < 1 Minute. Der Debugger ist dein wichtigstes Werkzeug, beschäftige dich bitte damit.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)