何时期望IEnumerable以及何时从Linq查询中期望IQueryable

时间:2011-09-28 14:32:12

标签: c# linq entity-framework

当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)

为什么?

2 个答案:

答案 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可能会对您有所帮助。