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;
}
}
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
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.
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.
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... 😄
Dein Query macht inhaltlich jetzt aber etwas völlig anderes als der ursprüngliche Query.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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... 😄
Ich sag nicht, dass er falsch ist; er macht nur was anderes.
Seiner:
Deiner:
Deiner macht durchaus mehr Sinn
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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)