2013-07-25 51 views
6

這段代碼有區別嗎?鏈式linq查詢執行命令

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

而且

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

它遞延查詢,我不知道,是不是相同呢?或者在第二種情況下whereInclude後執行?

謝謝。

+4

順序無關緊要。 – wudzik

+1

它們是等同的。在遍歷結果或調用ToList()之前,查詢不會執行。 – Oscar

+1

在這種情況下,是的,但與LINQ實體和包括[它並不總是這個明確的削減](http://blogs.msdn.com/b/alexj/archive/2009/06/02/tip-22-how -to-make-include-really-include.aspx) –

回答

2

對於選擇之前的EF訂單無關緊要。 LINQ查詢轉換爲SQL查詢並運行,SQL查詢優化器不關心原始查詢的順序。

正如Patryk指出的,當以下語句修改查詢結構時,訂單可能與Include有關,但where子句不會這樣做。

在其他LINQ查詢中,LINQ-to-Objects的順序可能會非常重要,因爲查詢不是按照SQL的方式重新優化的,並且只是從上到下進行處理,而某些LINQ方法需要先前的方法才能運行完成和處理結果,然後繼續處理第一個元素(例如,OrderBy)。

+0

在這種情況下,是的。但事實並非如此。許多查詢都依賴於順序,特別是在選擇後。 –

+0

@MystereMan,關於選擇的好點,我更新了我的答案以澄清這一點。關鍵是並非所有的LINQ都是相同的--LINQ到EF不同於LINQ到對象和任何其他LINQ。 LINQ to EF大部分轉換爲SQL,大多數順序無關緊要。 –