何时期望从Linq查询IEnumerable,何时期望从Linq查询IQueryable

本文关键字:查询 何时 Linq 期望 IQueryable IEnumerable | 更新日期: 2023-09-27 18:10:08

我有一些麻烦理解当Linq给我一个IQueryable结果,当它给我一个IEnumerable结果。

例子:
我用EF,我有两个实体LocationConfiguration。每个Location可以有多个Configurations

下面的查询给了我一个IQueryable作为结果:

Context.Locations.Where(l => l.Name == "SomeName")

而下面给我一个IEnumerable作为结果:

Context.Locations.Where(l => l.Name == "SomeName").First().Configurations.Select(c => c)

为什么?

何时期望从Linq查询IEnumerable,何时期望从Linq查询IQueryable

一般来说,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。