Ich habe viele Beiträge gesehen über IEnumerable
, dass es Filterung im Speicher und nicht in SQL-Server wie IQueryable
gilt.IEnumerable Filtration innerhalb sql statt Speicher?
Aber
Ich habe Tabelle 20 records
aus only one has Id = '12345'
mit.
Wenn ich tun
IEnumerable<Customer> customer = _context.Customer.where(x => x.Id== '12345');
Es gibt 1
Reihe und not of 20
Reihen. Warum?
Mein Verständnis ist es 20 Zeilen zunächst zurückkommen würde, später, wenn ich tun
var result = customers.ToList();
Es 1 Datensatz zurück.
Es werden keine Zeilen zurückgegeben. Es gibt einen Ausdruck zurück, der ausgewertet wird, wenn Sie die Ergebnisse iterieren. Dieser Ausdruck enthält eine "Wo" -Klausel, die in diese Bewertung einbezogen wird. – David
Sie haben ein Missverständnis, was "verzögerte Ausführung" bedeutet. Es bedeutet nicht, dass alle 20 Zeilen zurückgegeben werden. Stellen Sie sich vor, wie teuer das für jede Abfrage wäre, die jemals in Entity Framework geschrieben wurde. Was es bedeutet, ist, dass Ihre Abfrage genau das ist: eine Abfrage. Es wird nicht ausgeführt, bis Sie es durch irgendeine Form der Iteration erzwingen - sei es eine 'foreach', eine' ToList', eine 'ToArray', etc. –
Beachten Sie auch, dass nur weil' Kunde' deklariert ist type 'IEnumerable' bedeutet nicht, dass es kein 'IQueryable ' halten kann. 'IQueryable ' implementiert 'IEnumerable ': https://msdn.microsoft.com/en-us/library/system.linq.iqueryable(v=vs.110).aspx Also unabhängig davon, ob Sie es als ein 'behandeln IEnumerable ', das zugrunde liegende Objekt ist ein' IQueryable 'in Ihrem Beispiel. –
David