2016-04-26 97 views
1

這2個查詢在功能上是否相同?包含「AsEnumerable()」等效的Linq查詢

1)

var z=Categories 
     .Where(s=>s.CategoryName.Contains("a")) 
     .OrderBy(s => s.CategoryName).AsEnumerable() 
     .Select((x,i)=>new {x.CategoryName,Rank=i}); 

2)

var z=Categories.AsEnumerable() 
     .Where(s=>s.CategoryName.Contains("a")) 
     .OrderBy(s => s.CategoryName) 
     .Select((x,i)=>new {x.CategoryName,Rank=i}); 

我的意思是, 「AsNumerable()」 的順序在查詢改變從客戶端檢索的數據項的數目,或他們被檢索的方式?

謝謝你的幫助。

+0

是的,訂單很重要。請參閱:http:// stackoverflow。com/questions/3311244/understanding-asenumerable -in-linq-to-sql –

+0

這取決於你的LINQ提供者,但你沒有指定你正在使用哪一個。 LINQ to SQL?實體框架?還有別的嗎? – hvd

+0

LINQ to SQL ...,是的,我應該說。 –

回答

3

這2個查詢在功能上是否相同?

如果你相當於意味着最終結果,那麼很可能是(根據供應商如何實現這些操作),所不同的是在第二個查詢您所使用的內存擴展。

我的意思是,確實令「AsNumerable()」查詢修改 數量從客戶端,或者他們 檢索方式檢索的數據項的?

是,在第一個查詢,WhereOrderBy將被轉換爲SQL Select將在內存中執行。

在您的第二個查詢中,數據庫中的所有信息都被帶入內存,然後在內存中進行過濾和轉換。


Categories可能是一個IQueryable,所以您將使用在Queryable類的擴展。此版本的擴展接收Expression作爲參數,並且這些表達式樹允許將您的代碼轉換爲sql查詢。

AsEnumerable()將對象返回爲IEnumerable,因此您將使用在內存中直接執行的Enumerable類的擴展。

+3

'如果相當於你的意思是最後的結果,那麼是的,差異在於你在內存擴展中使用的第二個查詢;'這不一定是真的。查詢提供程序可能會稍微(甚至可能顯着)不同於這些操作的內存中等價物的語義。 – Servy

+0

@Servy:這是真的,更新了答案。 –

+2

另外'AsEnumerable'不會「轉換」集合,它只是強制編譯器將subseuent調用綁定到'IEnumerable'擴展方法而不是'IQueryable'。 –

1

是的,他們做同樣的事情,但以不同的方式。第一個查詢完成SQL數據庫本身中的所有選擇,排序和條件。

但是,第二個代碼段從數據庫中提取所有行並將其存儲在內存中。然後,它對數據進行分類,排序和應用條件,即現在存儲在內存中。

AsEnumerable()打破了查詢分爲兩個部分:

  1. 所述的內部分(AsEnumerable前查詢)作爲LINQ到SQL
  2. 外,部分(AsEnumerable後查詢)執行是作爲LINQ到對象執行