IEnumerable <tsource> Where&amp; IQueryable <tsource>其中扩展方法</tsource> </tsource>

时间:2012-06-21 10:41:00

标签: c# .net linq lambda extension-methods

之间有什么不同
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)

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

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

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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:4)

一个适用于IEnumerable<T>,另一个适用于IQueryable<T>

答案 2 :(得分:2)

当你有IQueryable<T>最终使用的数据源(SqlServer或其他)时,尚未查询,并且生成的sql仍然可以被其他条件修改。

当您有IEnumerable<T>时,可能的查询已实现,您只会过滤该集合。

答案 3 :(得分:2)

O.R。 Mapper的答案是最充足和最简单的。我认为你需要检查的是你可以找到difference between IEnumerable and IQueryable here的内容。