Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Null Reference Exception in Where Klausel mit LINQ
der_sharky
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

Null Reference Exception in Where Klausel mit LINQ

beantworten | zitieren | melden

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;
        }
    }
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5960
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
der_sharky
myCSharp.de - Member



Dabei seit:
Beiträge: 23

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Member



Dabei seit:
Beiträge: 1768
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
ThomasE.
myCSharp.de - Member



Dabei seit:
Beiträge: 453

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15520
Herkunft: BW

beantworten | zitieren | melden

Dein Query macht inhaltlich jetzt aber etwas völlig anderes als der ursprüngliche Query.
private Nachricht | Beiträge des Benutzers
ThomasE.
myCSharp.de - Member



Dabei seit:
Beiträge: 453

beantworten | zitieren | melden

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]
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von ThomasE. am .
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...
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15520
Herkunft: BW

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5960
Herkunft: Leipzig

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3061
Herkunft: Thüringen

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers