2016-06-15 4 views
0

Ich kam in den folgenden Code:Warum explodiert eine Nullreferenz in OrderBy nicht?

foreach(var member in manager.Memberships.Where(mem => someBooleanExpression) 
          .OrderBy(mem => mem.Person.LName).ToList()) { 
       if(member.Person == null) 
        continue; 
       addListItemToAllDropDowns(member.Person.FullName, member.PersonID.ToString()); 
      } 

Eigentlich habe ich die "fortzusetzen;" Linie mich, um zu illustrieren, was vor sich ging. Es trifft tatsächlich diese Linie. Ich verstehe nicht, wie das möglich ist.

Um in die Schleife zu gelangen, hätte es die Sammlung basierend auf member.Person bestellen müssen. Aber member.Person ist null für mindestens ein Element, also wie ist es möglich, dass es nicht explodiert ist? Ich habe .ToList() an das Ende der OrderBy hinzugefügt, um die Möglichkeit einer verzögerten Verwirrung zu beseitigen, aber das konnte nicht das Problem gewesen sein, da es die OrderBy vor dem Einstieg in die Schleife hätte realisieren müssen.

Mir ist keine spezielle Ausnahmebehandlung in OrderBy bekannt. Was vermisse ich?

Antwort

0

Ich habe es herausgefunden, bevor ich auf Post stoße, aber ich werde es hier dokumentieren. Der Grund dafür ist, dass manager.Memberships ein Ausdruck ist, der in T-SQL konvertiert wird. Wenn es eine Sammlung im Speicher wäre, wäre meine Erwartung richtig gewesen. Da es sich um einen Ausdruck handelt, hat es einige verlorene Übersetzungseffekte, wenn es in T-SQL konvertiert wird, was es nicht interessiert, ob Person null ist oder nicht. Undichte Abstraktion.

+0

Es muss so funktionieren oder Sie könnten nicht mit den meisten SQL-Daten arbeiten. Jede Nullwert-Spalte würde unbrauchbar werden. –

Verwandte Themen