2017-03-29 2 views
0

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.

+1

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

+1

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. –

+2

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

Antwort

0

Zu diesem Zeitpunkt tun Sie die where auf Ihrer IQueryable-Schnittstelle. (Denken Sie daran, dass die rechte Seite des = früher ausgeführt wird, dann die linke Seite)

IEnumerable<Customer> customer = _context.Customer.Where(x => x.Id == 12345); 

Was Sie gelesen haben, ist so etwas wie das:

IEnumerable<Customer> customers = _context.Customer 
IEnumerable<Customer> clientFiltered = customers.Where(x => x.Id == 12345); 

Wenn Sie dies tun wollen, als oneliner:

_context.Customer.AsEnumerable().Where(x => x.Id == 12345); 

Hinweis, in den späteren 2 Fällen haben Sie es zuerst auf IEnumerable gegossen, dann tun Sie eine genauere Where.

+0

Aaaah das ist der Punkt, den ich vermisste. Grundsätzlich bedeutet das Schreiben einer Zeile IEnumerable mit der Where-Klausel eigentlich zwei Zeilen Abfrage, die Sie oben erwähnt haben. Also ist die Filterung im Speicher für IEnumerable korrekt? und das ist der Grund, warum ich 1 gefilterten Datensatz anstelle von 20 bekomme. – simbada

+0

@Partially teilweise korrekt. Siehe mein Update. –