用小词解释为什么需要IQueryable <t> </t>

时间:2009-06-25 15:50:28

标签: .net linq ienumerable iqueryable

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

4 个答案:

答案 0 :(得分:12)

IQueryable<T>也扩展了IQueryable。基本上它是一个IQueryable,它可以用强类型的方式枚举。 (IQueryableIEnumerable<T>都已扩展IEnumerable,因此不会在此前面添加任何内容。)

现在,拥有一个强类型IQueryable允许LINQ to SQL(等)强类型化 - 否则你不能在没有强制转换的情况下编写Where子句等。涉及的实际LINQ方法属于Queryable类型,主要反映Enumerable方法,但采用表达式树而不是委托。 (如果之前没有使用表达式树,它们基本上是数据结构描述代码 - 而委托就是代码本身。所以你可以执行委托,但是你可以检查表达式树看它会做什么。)

答案 1 :(得分:5)

需要

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:0)

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

然后你解析页面以获得结果。