Nun, ich würde erwarten, dass es diese Zeile ist, die die Ausnahme auslöst:
var documentRow = _dsACL.Documents.First(o => o.ID == id)
First()
löst eine Ausnahme aus, wenn keine passenden Elemente gefunden werden können. Da Sie unmittelbar danach auf null testen, klingt dies wie gewünscht. Dabei FirstOrDefault()
wird der Standardwert für den Elementtyp (der für Referenztypen null ist) zurückgegeben, wenn keine übereinstimmenden Elemente gefunden werden:
var documentRow = _dsACL.Documents.FirstOrDefault(o => o.ID == id)
Andere Optionen, die in einigen Situationen in Betracht gezogen werden müssen, sind Single()
(wenn Sie glauben, dass es genau ein übereinstimmendes Element gibt) und SingleOrDefault()
(wenn Sie glauben, dass es genau ein oder null übereinstimmende Elemente gibt). Ich vermute, dass FirstOrDefault
dies in diesem speziellen Fall die beste Option ist, aber es lohnt sich trotzdem, über die anderen Bescheid zu wissen.
Auf der anderen Seite sieht es so aus, als ob Sie mit einem Join hier überhaupt besser dran wären. Wenn es Ihnen egal wäre, dass alle Übereinstimmungen (und nicht nur die ersten) ausgeführt werden, können Sie Folgendes verwenden:
var query = from target in _lstAcl.Documents
join source in _dsAcl.Document
where source.ID.ToString() equals target.ID
select new { source, target };
foreach (var pair in query)
{
target.Read = source.Read;
target.ReadRule = source.ReadRule;
// etc
}
Das ist einfacher und effizienter IMO.
Auch wenn Sie sich entscheiden, die Schleife zu halten, habe ich einige Vorschläge:
- Werde das Äußere los
if
. Sie brauchen es nicht, denn wenn Count Null ist, wird der for-Schleifenkörper niemals ausgeführt
Verwenden Sie exklusive Obergrenzen für for-Schleifen - sie sind in C # idiomatischer:
for (i = 0; i < _lstAcl.Documents.Count; i++)
Beseitigen Sie häufige Unterausdrücke:
var target = _lstAcl.Documents[i];
// Now use target for the rest of the loop body
Verwenden Sie nach Möglichkeit foreach
anstelle von for
:
foreach (var target in _lstAcl.Documents)
o.ID
dies eine NullReferenceException auf einen Nullwert auslösen würde.Aus der MSDN-Bibliothek:
quelle
Für diejenigen unter Ihnen, die dieses Problem beim Erstellen eines Controllers über das Kontextmenü hatten, wurde es durch erneutes Öffnen von Visual Studio als Administrator behoben.
quelle
Vielleicht kann es Ihnen helfen, Where () vor First () zu verwenden, da mein Problem in diesem Fall gelöst wurde.
quelle