3

这个...... MSDN页面, IQueryable(Of T) Interface。你能更好地解释为什么我们需要一个标记接口,它不会在 IEnumerable 上添加任何方法吗?

4

4 回答 4

12

IQueryable<T>也延伸IQueryable。基本上它是一个IQueryable可以以强类型方式枚举的。(两者都IQueryable已经IEnumerable<T>extend IEnumerable,所以它没有在这方面添加任何东西。)

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

于 2009-06-25T15:57:11.773 回答
5

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

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

于 2009-06-25T15:56:36.310 回答
3

它扩展IEnumerable和。它可能没有自己的方法,但是它将其他三个接口聚合为一个,因此您不必单独处理它们。IQueryableIEnumerable<T>

于 2009-06-25T15:57:42.397 回答
0

如果要将 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

然后解析页面以获取结果。

于 2009-06-25T16:17:37.723 回答