有这个...... MSDN页面, IQueryable(Of T) Interface。你能更好地解释为什么我们需要一个标记接口,它不会在 IEnumerable 上添加任何方法吗?
4 回答
IQueryable<T>
也延伸IQueryable
。基本上它是一个IQueryable
可以以强类型方式枚举的。(两者都IQueryable
已经IEnumerable<T>
extend IEnumerable
,所以它没有在这方面添加任何东西。)
现在,拥有强类型IQueryable
允许 LINQ to SQL (etc) 被强类型 - 否则你不能在Where
没有强制转换的情况下编写子句等。实际涉及的 LINQ 方法在Queryable
类型中,很大程度上反映了Enumerable
方法,但采用表达式树而不是委托。(如果您以前没有使用过表达式树,它们基本上是描述代码的数据结构 - 而委托是代码本身。因此您可以执行委托,但您可以检查表达式树以查看它会做什么。 )
IQueryable<T>
是必需的,因为它定义了 LINQ 提供程序所需的合同。许多可用的扩展方法IQueryable<T>
旨在接受表达式而不是委托。
这一点很重要,因为 LINQ 提供者需要分析表达式树而不是调用委托。
它扩展IEnumerable
和。它可能没有自己的方法,但是它将其他三个接口聚合为一个,因此您不必单独处理它们。IQueryable
IEnumerable<T>
如果要将 linq 查询转换为表达式树 (System.Linq),请使用 IQueryable。从表达式树中,您可以轻松地将 LINQ 查询翻译成另一种语言(Linq To SQL 的 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
然后解析页面以获取结果。