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
//
}
Nur Entities und 'IEnumerable' sind Lazyloaded. – gdoron