当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)
为什么?
答案 0 :(得分:4)
通常,IQueryable上的LINQ扩展方法(在Queryable中定义)返回IQueryables,IEnumerable上的LINQ扩展方法(在Enumerable中定义)返回IEnumerables。在这种特殊情况下,Configurations是第一个返回的Location对象上的集合(IEnumerable)。因此.Select
调用返回IEnumerable。
编辑:为了让它全部远程执行,你可以试试这个:
Context.Locations.Where(l => l.Name == "SomeName").Configurations
假设您在Locations上的过滤器只返回一行,您应该得到相同的结果。当然它将是一个IQueryable,但这不应该有所作为。如果您需要实现它,您可以执行以下操作:
Context.Locations.Where(l => l.Name == "SomeName").Configurations.ToList()
答案 1 :(得分:1)
基本上,IQueryable允许远程数据源(如SQL Server)。如果可能,它将对数据库起作用。 IEnumerable适用于内存中的集合。
因此,如果您要查询SQL Server数据库,您将获得IQueryable。否则它将是一个IEnumerable。
此article可能会对您有所帮助。