【问题标题】:Diferences between IEnumerable<TSource> Where & IQueryable<TSource> Where extension methodsIEnumerable<TSource> Where & IQueryable<TSource> Where 扩展方法的区别
【发布时间】:2012-06-21 10:41:00
【问题描述】:

两者有什么区别

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);

为什么存在委托函数和委托函数的表达式?我必须照顾它吗?

【问题讨论】:

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


    【解决方案1】:

    IEnumerable 只是 C# 项的序列。 IEnumerable 版本的 Select 实际上只是在 C# 中迭代​​输入 IEnumerable 中的项目,针对委托函数测试它们,并产生匹配的项目。

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

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

    【讨论】:

      【解决方案2】:

      一个在IEnumerable&lt;T&gt; 上工作,另一个在IQueryable&lt;T&gt; 上工作。

      【讨论】:

        【解决方案3】:

        当您拥有IQueryable&lt;T&gt; 时,尚未查询最终使用的数据源(SqlServer 或其他),并且生成的 sql 仍可以通过附加条件进行修改。

        当您拥有IEnumerable&lt;T&gt; 时,可能的查询将被具体化,您将只过滤集合。

        【讨论】:

          【解决方案4】:

          手术室Mapper 的回答是最充分和最简单的。我认为您需要检查的是difference between IEnumerable and IQueryable 是什么,您可以找到here

          【讨论】:

            猜你喜欢
            • 2012-08-14
            • 1970-01-01
            • 2016-02-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-11
            • 2010-10-26
            • 1970-01-01
            相关资源
            最近更新 更多