何时期望从Linq查询IEnumerable,何时期望从Linq查询IQueryable
本文关键字:查询 何时 Linq 期望 IQueryable IEnumerable | 更新日期: 2023-09-27 18:10:08
我有一些麻烦理解当Linq给我一个IQueryable结果,当它给我一个IEnumerable结果。
例子:
我用EF,我有两个实体Location
和Configuration
。每个Location
可以有多个Configurations
下面的查询给了我一个IQueryable作为结果:
Context.Locations.Where(l => l.Name == "SomeName")
而下面给我一个IEnumerable作为结果:
Context.Locations.Where(l => l.Name == "SomeName").First().Configurations.Select(c => c)
为什么?
一般来说,IQueryable(在Queryable中定义)上的LINQ扩展方法返回IQueryables, IEnumerable(在Enumerable中定义)上的LINQ扩展方法返回IEnumerables。在这种特殊情况下,Configurations是第一个返回Location对象的集合(IEnumerable)。因此,.Select
调用返回一个IEnumerable。
编辑:要使它全部远程执行,您可以尝试这样做:
Context.Locations.Where(l => l.Name == "SomeName").Configurations
假设您的位置过滤器只会返回一行,您应该得到相同的结果。当然,它将是一个可查询的,但这应该没有什么不同。如果您需要实现它,您可以这样做:
Context.Locations.Where(l => l.Name == "SomeName").Configurations.ToList()
基本上,IQueryable允许远程数据源(如SQL Server)。如果可能的话,它将对数据库工作。IEnumerable适用于内存集合。
所以,如果你正在查询一个SQL Server数据库,你会得到一个IQueryable。否则它将是IEnumerable。