myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns
» Datenschutzerklärung
» Impressum

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Grundlagen von C# » Null Reference Exception in Where Klausel mit LINQ
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Null Reference Exception in Where Klausel mit LINQ

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
der_sharky der_sharky ist männlich
myCSharp.de-Mitglied

Dabei seit: 12.05.2017
Beiträge: 18


der_sharky ist offline

Null Reference Exception in Where Klausel mit LINQ

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

C#-Code:
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
            };
        }

C#-Code:
public class ObjectContactsRow
    {

        public double areaSize { get; set; }

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

            Row[index++] = areaSize;

            return Row;
        }
    }

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von der_sharky am 05.05.2019 16:15.

05.05.2019 16:12 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.141
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

So könntest du es lösen:

C#-Code:
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
05.05.2019 16:20 Beiträge des Benutzers | zu Buddylist hinzufügen
der_sharky der_sharky ist männlich
myCSharp.de-Mitglied

Dabei seit: 12.05.2017
Beiträge: 18

Themenstarter Thema begonnen von der_sharky

der_sharky ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
05.05.2019 20:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.198
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
05.05.2019 21:13 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 418
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

wie wäre es mit dieser Variante:

C#-Code:
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:

C#-Code:
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
06.05.2019 08:57 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.639
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Dein Query macht inhaltlich jetzt aber etwas völlig anderes als der ursprüngliche Query.
06.05.2019 10:58 Beiträge des Benutzers | zu Buddylist hinzufügen
ThomasE. ThomasE. ist männlich
myCSharp.de-Mitglied

avatar-178.gif


Dabei seit: 26.11.2013
Beiträge: 418
Entwicklungsumgebung: Visual Studio 2015Pro/2017Ent


ThomasE. ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,

also dieses hier:

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

ist Schwachsinn, kann nicht funktionieren.
->

C#-Code:
double? arInvArea = arInv.Area.FirstOrDefault(p => p != null && p.WithSwimmingPool)?.Units(ReportDate);

.


dieses:

C#-Code:
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...

C#-Code:
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 06.05.2019 15:33.

06.05.2019 15:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 12.639
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
06.05.2019 15:38 Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.141
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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...
06.05.2019 16:48 Beiträge des Benutzers | zu Buddylist hinzufügen
LaTino LaTino ist männlich
myCSharp.de-Poweruser/ Experte

avatar-4122.png


Dabei seit: 03.04.2006
Beiträge: 2.966
Entwicklungsumgebung: Rider / VS2019 / VS Code
Herkunft: Thüringen


LaTino ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
07.05.2019 08:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 22.05.2019 05:28