标准查询操作符对实现IEnumerable<T>
接口的Linq to Object序列进行操作,而对IQueryable<T>
接口类型的序列调用Linq to Sql操作符。因此,标准查询操作符不能在IQueryable<T>
类型的序列上调用,除非该序列首先被强制转换为IEnumerable<T>
(通过AsEnumerable
操作符)
a)为什么没有Linq to Sql对应(如Reverse()
)的标准查询操作符不能在IQueryable<T>
序列上调用?也就是说,IQueryable<T>
派生自IEnumerable<T>
,因此扩展实现IEnumerable<T>
的类的扩展方法也应该扩展实现从IEnumerable<T>
派生的接口的类。
b)无论如何,为什么能够在IQueryable<T>
类型的序列上调用标准查询操作符(那些没有Linq到Sql对应的操作符),而不首先将此序列转换为IEnumerable<T>
(通过AsEnumerable
操作符),这是一个坏主意?
谢谢
IQueryable<T>
一般不只是用于Linq to SQL,它是一种约定,任何查询提供程序都可以选择支持有限的一组操作-并非所有查询提供程序都支持相同的子集。
支持的子集取决于在查询提供程序的域中什么是有意义的。IQueryable<T>
对一个表达式树进行操作,该表达式树允许查询提供者将查询转换为用于底层数据源的特定领域语言(即SQL)。
如果我正确理解你的问题Linq到SQL查询产生SQL查询,因为Linq到SQL是不同的Linq提供程序,IEnumerable用于查询内存集合