有this ... MSDN page, IQueryable(Of T) Interface。你能更好地解释为什么我们需要一个不在IEnumerable上添加任何方法的标记接口吗?
答案 0 :(得分:12)
IQueryable<T>
也扩展了IQueryable
。基本上它是一个IQueryable
,它可以用强类型的方式枚举。 (IQueryable
和IEnumerable<T>
都已扩展IEnumerable
,因此不会在此前面添加任何内容。)
现在,拥有一个强类型IQueryable
允许LINQ to SQL(等)强类型化 - 否则你不能在没有强制转换的情况下编写Where
子句等。涉及的实际LINQ方法属于Queryable
类型,主要反映Enumerable
方法,但采用表达式树而不是委托。 (如果之前没有使用表达式树,它们基本上是数据结构描述代码 - 而委托就是代码本身。所以你可以执行委托,但是你可以检查表达式树看它会做什么。)
答案 1 :(得分:5)
IQueryable<T>
,因为它定义了LINQ提供程序所需的合同。 IQueryable<T>
上提供的许多扩展方法都旨在接受表达式而不是委托。
这很重要,因为LINQ提供程序需要分析表达式树而不是调用委托。
答案 2 :(得分:3)
它扩展了IEnumerable
,IQueryable
和IEnumerable<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
然后你解析页面以获得结果。