IQueryable的< T> vs IEnumerable< T>有Lambda,可以选择哪个?
题
我使用Lambda做了越来越多的练习,但我不知道为什么有时会使用 .AsQueryable();
来使用IQueryable,有时它会省略 .AsQueryable();
并使用IEnumerable。
我已阅读 MSDN 但我不知道如何“执行表达式树”比没有优势。
任何人都可以向我解释一下吗?
解决方案
IQueryable实现IEnumerable,所以马上就可以使用IQueryable,你可以用IEnumerable做所有事情。 IQueryables处理将一些lambda表达式转换为基础数据源的查询 - 这可以是SQL数据库或对象集。
基本上,如果它是IQueryable或IEnumerable,你通常不应该关心这种或那种方式。
其他提示
作为用户,您通常不必关心,它实际上是关于数据源的实现者。如果数据提供者只是实现了IEnumerable,那么你基本上就是对象执行LINQ,即它在集合的内存操作中。 IQueryable为数据源提供了在表达式执行后(通常通过枚举)将表达式树转换为替代表示形式以执行的能力,这就是Linq2Sql,Linq2Xml和Linq2Entities所做的事情。
我唯一能看到最终用户关怀的是,他们是否希望检查将要执行的Expression树,因为IQueryable暴露了Expression。另一个用途可能是检查提供者。但是这两种情况都应该真正保留给其他查询提供程序的实现者,并希望转换表达式。 Linq的观点是你不必关心要使用的表达式执行的实现。
我同意Arne Claassen的观点,有些情况下您需要考虑数据源提供的潜在影响。例如,请查看此博客发布,显示IEnumerable和IQueryable生成的SQL在某些情况下是如何不同的。