【发布时间】:2010-11-05 21:27:19
【问题描述】:
有this ... MSDN page, IQueryable(Of T) Interface。你能更好地解释为什么我们需要一个不添加任何方法超过 IEnumerable 的标记接口吗?
【问题讨论】:
标签: .net linq ienumerable iqueryable
有this ... MSDN page, IQueryable(Of T) Interface。你能更好地解释为什么我们需要一个不添加任何方法超过 IEnumerable 的标记接口吗?
【问题讨论】:
标签: .net linq ienumerable iqueryable
IQueryable<T> 也扩展了IQueryable。基本上它是一个IQueryable,可以以强类型的方式枚举。 (IQueryable 和 IEnumerable<T> 都已经扩展了 IEnumerable,所以它没有在这方面添加任何东西。)
现在,拥有强类型的IQueryable 允许对 LINQ to SQL(等)进行强类型 - 否则您无法在不强制转换的情况下编写 Where 子句等。实际涉及的 LINQ 方法在 Queryable 类型中,很大程度上反映了 Enumerable 方法,但采用 表达式树 而不是委托。 (如果您以前没有使用过表达式树,它们基本上是描述代码的数据结构 - 而委托是代码本身。因此您可以执行委托,但您可以检查表达式树看看它会做什么。)
【讨论】:
IQueryable<T> 是必需的,因为它定义了 LINQ 提供程序所需的合同。 IQueryable<T> 上可用的许多扩展方法旨在接受表达式而不是委托。
这很重要,因为 LINQ 提供程序需要分析表达式树而不是调用委托。
【讨论】:
它扩展了IEnumerable、IQueryable 和IEnumerable<T>。它可能没有自己的方法,但它会将其他三个接口聚合为一个,因此您不必单独处理它们。
【讨论】:
如果要将 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
然后你解析页面得到结果。
【讨论】: