Entity Framework 是否支持 COUNT(*) OVER()

Does Entity Framework support COUNT(*) OVER()

简介

就像 this question 与 nhibernate 相关,我想知道 Entity Framework 是否存在类似的东西 6. 我做了一些研究,但没有找到任何有用的东西。

除了使用 .Skip(x).Take(y) 查询分页结果外,我们还想在应用分页之前获取与 where 子句 匹配的所有项目的计数.

我们现在将应用了 where 子句 的 LINQ 查询放在一个变量中,这样我们就可以使用它两次,一次获取计数,一次获取分页结果。

但出于性能原因,我们希望在一个查询中同时执行这两项操作,就像您在 RAW SQL 查询中使用 COUNT(*) OVER() 一样。

问题

Entity Framework 是否以某种方式支持 COUNT(*) OVER()?如果没有,您能指出从哪里开始寻找实现这个的方法吗?

提案

首先我想创建一个 IQueryable<T> 扩展方法:CountOver(out long totalCount),但这可能行不通,因为我们仍在构建查询。

然后我考虑引入一个属性[CountOver],我们可以在我们的实体模型中使用它:

public class Person
{
    public string Fullname { get; set; }
    [CountOver]
    public long TotalCount { get; set; }
}

如果我们可以修改源代码,后者实现起来就不难了,但目前我不知道这是否可行...

没有。 LINQ 没有概念上转换为 COUNT() OVER() 的查询运算符。但是您可以对 Count() 的行和 select 的结果重复使用查询。

例如,类似

        var q = db. . . ;

        var q2 = from r in q
                 select new { r, count = q.Count() };