2

之间有什么区别

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

4 回答 4

5

AnIEnumerable只是一系列 C# 项。在 C# 中,字面上的IEnumerable版本只是迭代 input 中的项目,针对委托函数测试它们,并产生匹配的项目。SelectIEnumerable

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

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

于 2012-06-21T10:49:16.980 回答
4

一个工作IEnumerable<T>,另一个工作IQueryable<T>

于 2012-06-21T10:42:23.793 回答
2

当您有IQueryable<T>一个最终使用的数据源(SqlServer 或其他)尚未查询时,生成的 sql 仍然可以通过附加条件进行修改。

当您拥有一个IEnumerable<T>可能的查询时,您将只过滤集合。

于 2012-06-21T10:49:46.197 回答
2

OR Mapper 的回答是最充分和最简单的。我认为您需要检查的是IEnumerable 和 IQueryable 之间的区别,您可以在此处找到。

于 2012-06-21T10:50:31.033 回答