我有:
IQueryable<Entity> query = (from e in Context.Set<TEntity>() select e);
IEnumerable<TEntity> result = query.OrderBy(x=>x.Property).Skip(10).Take(10);
OrderBy / Skip / Take返回IEnumerable<T>
。我担心会发生什么,所有的结果都将被返回,然后Linq将被用来只占用它们的一部分。
我的问题是:OrderBy / Skip和Take是否包含在已发布的SQL查询中,以便只返回所请求的总结果子集?
答案 0 :(得分:3)
OrderBy / Skip / Take返回
IEnumerable<T>
OrderBy
has an overload that returns IOrderedQueryable<T>
,不仅IOrderedEnumerable<T>
。 Skip
和Take
也是如此。 C#编译器非常聪明,只要不强制它执行其他操作,就会优先选择返回IEnumerable<T>
的重载。只要您没有过早地将其转换为IEnumerable
,该操作将在数据库中执行。
答案 1 :(得分:2)
OrderBy / Skip和Take是否包含在已发布的SQL查询中,以便仅返回所请求的总结果子集?
是的,所有这些方法都受支持,它们将转换为SQL。整个列表为here,因为您可以看到每个方法都有重载IQueryable<T>
。
答案 2 :(得分:1)
是的,它们被转换为SQL并直接针对数据库执行。