2013-07-25 17 views
6

Czy jest różnica w tym kodzie?Zamawianie łańcucha zapytania linq

var query = DbContext.Customers 
       .Where(<condition>) 
       .Include("Address"); 

I

var query = DbContext.Customers 
       .Include("Address") 
       .Where(<condition>); 

To odroczonego zapytania, a ja nie wiem, czy to odpowiednik? Lub w drugim przypadku where jest wykonywany po Include?

Dzięki.

+4

Zamówienie nie ma znaczenia. – wudzik

+1

Są one odpowiednikami. Zapytanie nie zostanie wykonane, dopóki nie wykonasz iteracji wyników lub nie wywołasz ToList(). – Oscar

+1

W tym przypadku tak, ale z LINQ To Entities i Włącz [nie zawsze jest to jasne cięcie] (http://blogs.msdn.com/b/alexj/archive/2009/06/02/tip-22-how -to-make-include-really-include.aspx) –

Odpowiedz

2

Dla zamówienia EF przed wyborem nie ma znaczenia. Zapytanie LINQ jest konwertowane na zapytanie SQL i uruchamiane, a optymalizator zapytań SQL nie dba o kolejność pierwotnego zapytania.

Jak zauważył Patryk, zamówienie może mieć szczególne znaczenie przy Include, gdy następujące instrukcje modyfikują strukturę zapytania, ale klauzula where nie powoduje tego.

W innych zapytaniach LINQ, LINQ-to-Objects, kolejność może mieć duże znaczenie, ponieważ zapytanie nie jest ponownie optymalizowane tak jak SQL i jest przetwarzane od góry do dołu, a niektóre metody LINQ wymagają wcześniejszych metod do uruchomienia zakończenie i wyniki procesu przed przejściem do nawet pierwszego elementu (na przykład: OrderBy).

+0

W tym przypadku tak. Ale to nie zawsze prawda. Wiele zapytań zależy od zamówienia, szczególnie po wyborze. –

+0

@MystereMan, dobry punkt o wyborze, zaktualizowałem swoją odpowiedź, aby wyjaśnić ten punkt. Kluczowym punktem jest to, że nie wszystkie LINQ są takie same - LINQ do EF różni się od LINQ do obiektów i innych LINQ. LINQ do EF jest najczęściej konwertowane do SQL i większość porządku nie ma znaczenia. –

Powiązane problemy