2013-05-31 12 views

Antwort

10

Was ist das Standardverhalten von FirstOrDefault() bei Verwendung mit Linq zu SQL?

Es eifrig berechnet das Ergebnis der Abfrage. Der einfachste Weg, darüber zu rechnen, ist zu erkennen, dass der Rückgabetyp int, nicht IEnumerable<int> ist, die kann aufgeschoben werden, bis GetEnumerator aufgerufen wird, aber int hat keinen solchen Mechanismus.

Die Formulierung Ihrer Frage deutet darauf hin, dass Sie auch fragen, ob es eine Möglichkeit gibt, dieses Verhalten zu ändern. Es gibt, aber nicht direkt durch FirstOrDefault oder irgendwelche Mechanismen in LINQ. Aber Sie können mit Lazy<T> verzögern. Kein Compiler handlich, also vergib mir, wenn das nicht kompiliert, aber es sollte dir sehr nahe kommen.

Lazy<int> value = new Lazy<int>(
    () => { 
     var query = 
      from p in context.tableX 
      select p.Id; 
     var result = query.FirstOrDefault(); 
     return result; 
    } 
); 

if(value.Value > 0) { // execution will be deferred until here 
    // 
} 
+0

Wenn IEnumerable Objekt als, wie FirstOrDefault() verhält sich ??? –

+1

@Iti Tyagi - Klingt so, als würden Sie fragen, ob FirstOrDefault() einen Aufruf von GetEnumerator auslösen wird. Würde query.FirstOrDefault() zu einem verzögerten Laden oder eifrigen Laden führen (d.h. wird es GetEnumerator aufrufen oder nicht)? Ich glaube, etwas wie query.ToList() würde eine eifrige Last erzwingen - würde FirstOrDefault() dasselbe tun? –

2

Eager Laden!

Wenn man darüber nachdenkt, es gibt nur eine einfache int - ein int kann möglicherweise nicht „einen Weg zu gehen und eine int zu bekommen“ darstellen. (Das ist, was Lazy<int> für ... ist)

8

Alle Standard-Linq Operatoren, die einzelne, nicht-zählbare Ergebnis zurückkehren werden sofort an der Stelle ausgeführt, wo die Anfrage erklärt. So werden FirstOrDefault, Count, Sum und andere Operatoren, die einen einzelnen Wert zurückgeben, sofort ausgeführt. Hier

ist schön MSDN-Artikel Classification of Standard Query Operators by Manner of Execution

2

Es wird Eager Laden, wenn Sie Erweiterungsmethoden auf der zählbare result.If verwenden Sie nicht diese Erweiterungsmethoden verwenden Sie es Lazy Loading sein wird, und man kann nicht wirklich holen die Werte, bis Sie über das Linq-Ergebnis aufzählen