我用 Lambda 做越来越多的练习,但我不明白为什么有时.AsQueryable();
使用 IQueryable 的示例,有时却省略.AsQueryable();
并使用 IEnumerable。
我已经阅读了MSDN,但我没有看到“执行表达式树”比没有优势。
谁能给我解释一下?
IQueryable 实现了 IEnumerable,因此立即使用 IQueryable,您可以完成使用 IEnumerable 可以完成的所有操作。IQueryables 处理将一些 lambda 表达式转换为对底层数据源的查询——这可能是 SQL 数据库或对象集。
基本上,您通常不必关心它是 IQueryable 还是 IEnumerable。
作为用户,您通常不必关心,这实际上与数据源的实现者有关。如果数据提供者只是实现 IEnumerable,那么您基本上是在执行 LINQ 对象执行,即它在集合上的内存操作中。IQueryable 为数据源提供了在执行表达式后将表达式树转换为备用表示的能力(通常通过枚举),这就是 Linq2Sql、Linq2Xml 和 Linq2Entities 所做的。
我唯一能看到最终用户关心的情况是,他们是否希望检查将要执行的表达式树,因为 IQueryable 公开了表达式。另一种用途可能是检查提供者。但是这两种情况都应该留给其他查询提供者的实现者并希望转换表达式。Linq 的重点是您不必关心要使用的表达式执行的实现。
我同意 Arne Claassen 的观点,在某些情况下,您需要考虑数据源提供的底层实现。例如查看这篇博客文章,它显示了 IEnumerable 和 IQueryable 生成的 SQL 在某些情况下是如何不同的。