2012-06-21 30 views
2

什麼是這兩種方法都可以接受以同樣的方式lambda表達式個體差異在哪裏與IQueryable的<TSource>凡擴展方法

public static IEnumerable<TSource> Where<TSource> 
     (this IEnumerable<TSource> source, Func<TSource, bool> predicate) 

public static IQueryable<TSource> Where<TSource> 
     (this IQueryable<TSource> source, 
     Expression<Func<TSource, bool>> predicate) 

之間的性差異。

List<string> fruits = 
       new List<string> { "apple", "passionfruit", "banana", "mango", 
           "orange", "blueberry", "grape", "strawberry" }; 
IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6); 

爲什麼委託函數和委託函數的表達式存在?我必須關心它嗎?

回答

5

IEnumerable只是一系列C#項目。 版Select字面上只是在C#中通過輸入IEnumerable中的項目進行迭代,根據委託函數對它們進行測試,並生成匹配的項目。

但是,IQueryable可以代表例如SQL表中的項目。 (或許多其他類型的數據源,但SQL可能是最常見的。)SelectIQueryable版本可以將該表達式轉換爲SQL查詢(或類似語言)的一部分,並傳遞決定返回到哪些項目的負擔SQL服務器(或類似的)。

您並不需要擔心這個區別 - LINQ可以隱藏所有這些細節。如果您正在查詢C#對象列表,它將使用IEnumerable版本;如果您通過Linq-to-SQL查詢SQL,它將使用IQueryable版本。

4

一個在IEnumerable<T>上工作,另一個在IQueryable<T>上工作。

2

如果您有IQueryable<T>最終使用的數據源(SqlServer或其他)尚未被查詢,並且生成的sql仍可能被其他條件修改。

如果你是一個IEnumerable<T>可能的查詢是物化的,你只會過濾集合。

相關問題