IEnumerable <TSource> Where&IQueryable <TSource>之间的差异扩展方法

jlv*_*ero 2 .net c# linq lambda extension-methods

两者之间有什么不同

public static IEnumerable<TSource> Where<TSource>
        (this IEnumerable<TSource> source, Func<TSource, bool> predicate)
Run Code Online (Sandbox Code Playgroud)

public static IQueryable<TSource> Where<TSource>
        (this IQueryable<TSource> source, 
         Expression<Func<TSource, bool>> predicate)
Run Code Online (Sandbox Code Playgroud)

两种方法都可以以相同的方式接受lambda表达式.

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

为什么委托函数的委托功能和表达存在?我必须要小心吗?

Raw*_*ing 5

An IEnumerable只是一系列C#项目.字面上的IEnumerable版本Select只是在C#中通过输入中的项进行迭代,IEnumerable根据委托函数测试它们,并产生匹配的项.

IQueryable但是,An 可以表示例如SQL表中的项.(或许多其他类型的数据源,但SQL可能是最常见的.)IQueryable版本Select可以将表达式转换为SQL查询(或类似)的一部分,并传递决定返回SQL的项目的负担服务器(或类似的).

你真的不必担心这种区别 - LINQ可以为你隐藏所有这些细节.如果您要查询C#对象列表,它将使用该IEnumerable版本; 如果您通过Linq-to-SQL查询SQL,它将使用该IQueryable版本.