2016-06-14 13 views
8

Ich wundere mich, wenn ich mehrere Where(...) Methoden nacheinander verwenden, ist EntityFramework intelligent genug, um es in einer resultierenden Abfrage zu kombinieren. Lassen Sie sich sagen, ich habe:EntityFramework Mehrere Wo

context.Items 
    .Where(item => item.Number > 0) 
    .Where(item => item.Number < 5) 
    .ToList(); 

Wird die resultierende SQL-Abfrage das gleiche sein, wie wenn ich schreibe:

context.Items 
    .Where(item => item.Number > 0 && item.Number < 5) 
    .ToList(); 

Gibt es hinter den Kulissen Optimierungen für mehr Where-Klausel?

+0

verwenden sollten Sie beide für alle wichtigen Anbieter auf die gleiche SQL übersetzen. Sie können immer beide ausprobieren und sehen, was SQL jeweils produziert. –

+1

Ja multiple wo ist das gleiche wie Beitritt Bedingungen mit && (die Sie selbst in etwa einer Minute übrigens überprüft haben könnte). – Evk

+0

@Evk Ich konnte keine JIT- oder Syntax-Zuckeroptimierungen schnell überprüfen, ohne in Dokumente und IL zu graben. Bitte sehen Sie meine letzte Frage. Vielen Dank. – Andrei

Antwort

5

Ja, da sind. Es ist nicht Entity Framework, das dies tut. Es ist eigentlich der Auftrag der SQL-Provider-Factory, die Abfrage für die Datenbank zu erstellen. Abhängig von der verwendeten Datenbank stammt dieser Code aus verschiedenen Quellen.

Für MSSQL ist der Code von Microsoft und befindet sich in der Bibliothek System.Data.SqlClient. Wenn Sie Ihr Verbindungselement in Ihrer web.config betrachten, sollten Sie das Attribut "providerName" bemerken.

In dieser Bibliothek oder in ähnlichen Bibliotheken wird häufig ein rekursives Besuchermuster verwendet, um durch das definierte Expression Tree-Objektdiagramm zu navigieren, um die effizienteste mögliche Abfrage zu erzeugen.

Die Verwendung mehrerer Where-Klauseln ist sehr einfach zu erkennen und zu optimieren. Der Ort, an dem diese Art von Bibliotheken Probleme hat, ist meist mit tief verschachtelten Projektionen.

können Sie die SQL durch Ihre Frage erzeugt, ob Sie

context.Items 
.Where(item => item.Number > 0) 
.Where(item => item.Number < 5) 
.ToString(); 
+0

Danke für Ihre Antwort! – Andrei

Verwandte Themen