【问题标题】:Explain in small words why IQueryable<T> is needed用简短的语言解释为什么需要 IQueryable<T>
【发布时间】:2010-11-05 21:27:19
【问题描述】:

this ... MSDN page, IQueryable(Of T) Interface。你能更好地解释为什么我们需要一个不添加任何方法超过 IEnumerable 的标记接口吗?

【问题讨论】:

    标签: .net linq ienumerable iqueryable


    【解决方案1】:

    IQueryable&lt;T&gt; 也扩展了IQueryable。基本上它是一个IQueryable,可以以强类型的方式枚举。 (IQueryableIEnumerable&lt;T&gt; 都已经扩展了 IEnumerable,所以它没有在这方面添加任何东西。)

    现在,拥有强类型的IQueryable 允许对 LINQ to SQL(等)进行强类型 - 否则您无法在不强制转换的情况下编写 Where 子句等。实际涉及的 LINQ 方法在 Queryable 类型中,很大程度上反映了 Enumerable 方法,但采用 表达式树 而不是委托。 (如果您以前没有使用过表达式树,它们基本上是描述代码的数据结构 - 而委托是代码本身。因此您可以执行委托,但您可以检查表达式树看看它会做什么。)

    【讨论】:

    • 已经 7 年了,但自从这位可敬的作者提出报价后,我会接受它:表达式树的虚拟证明解释是否可能?也许是为了未来读者的利益而不是我,因为谷歌正在招手 :)
    • @BKSpureon:我会补充一点,但这并不是问题的重点,所以说实话,我认为你最好有一个教程。
    【解决方案2】:

    IQueryable&lt;T&gt; 是必需的,因为它定义了 LINQ 提供程序所需的合同。 IQueryable&lt;T&gt; 上可用的许多扩展方法旨在接受表达式而不是委托。

    这很重要,因为 LINQ 提供程序需要分析表达式树而不是调用委托。

    【讨论】:

      【解决方案3】:

      它扩展了IEnumerableIQueryableIEnumerable&lt;T&gt;。它可能没有自己的方法,但它会将其他三个接口聚合为一个,因此您不必单独处理它们。

      【讨论】:

        【解决方案4】:

        如果要将 linq 查询转换为表达式树 (System.Linq),请使用 IQueryable。 从表达式树中,您可以轻松地将 LINQ 查询翻译成另一种语言(SQL for Linq To SQL. 另一个经典示例是 Linq to Google,您希望在其中进行此查询:

        var searchResult = from result 
                           in Google.Repository 
                           where result.Equals("i love linq") 
                           select result;
        

        翻译成这个网址:

        http://www.google.com/search?hl=en&q=i+love+linq&aq=f&oq=&aqi=g10

        然后你解析页面得到结果。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-21
          • 2015-02-27
          • 2019-10-14
          • 2019-05-15
          • 2015-02-27
          • 1970-01-01
          • 1970-01-01
          • 2011-02-09
          相关资源
          最近更新 更多