2017-08-05 40 views
-1

我在我的程序中使用LINQ到實體執行過濾器,我有以下兩個簡單的查詢:爲什麼AsEnumerable還對服務器

var result = dbContext.Customers.Where(c => c.Name == "Mostafa").ToList(); 
var result2 = dbContext.Customers.Where(c => c.Name == "Mostafa").AsEnumerable().ToList(); 
當我運行SQL事件探查器

,我發現生成的SQL兩個查詢的查詢都是一樣的! 問題是爲什麼在第二個查詢,雖然我使用asEnumerable,執行服務器端的過濾?

更新:改變所述第二查詢時是這樣 濾波塗布於存儲器,而不是服務器:

var result2 = dbContext.Customers.AsEnumerable().Where(c => c.Name == "Mostafa").ToList(); 

由於@Willem範Onsem

+2

不應該在'Where(..)'之前使用'AsEnumerable()'嗎? –

+0

請解釋您爲什麼認爲這兩條語句應該生成不同的SQL語句。 –

+0

謝謝@WillemVanOnsem,您的解決方案可以運行。 –

回答

5

AsEnumerable()使得其餘的查詢在本地執行。早於AsEnumerable()的任何內容仍然是執行流程的一部分。例如,考慮一下這個(想象一個Age屬性):

var result = dbContext.Customers 
    .Where(c => c.Name == "Mostafa") 
    .Where(c => c.Age == 18) 
    .ToList(); 

這將導致其名字和年齡過濾SQL。相比之下,與此:

var result = dbContext.Customers 
    .Where(c => c.Name == "Mostafa") 
    .AsEnumerable() 
    .Where(c => c.Age == 18) 
    .ToList(); 

這將名字在SQL過濾器,但它會按年齡局部過濾器(在內存中)。

+0

你也可以聲明做'.AsEnumerable()。ToList()'(中間沒有任何東西)是沒有意義的 –

相關問題