Entity Framework支持COUNT(*) OVER()吗?

4

介绍

就像与nhibernate相关的这个问题一样,我想知道Entity Framework 6是否有类似的东西。我做了一些研究,但没有找到任何可用的东西。

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

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

但出于性能原因,我们希望在一个查询中完成两个操作,就像在原始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; }
}

如果我们能够修改源代码,那么实现起来就不会那么困难,但目前我甚至不知道这是否可能...
1个回答

4

不,LINQ没有一个查询运算符可以概念上翻译成COUNT() OVER()。但是您可以重复使用一个查询来对其行进行计数,并选择其结果。

例如,类似于以下内容:

        var q = db. . . ;

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

3
似乎需要将其翻译成 CROSS JOIN 并使用两次相同的子查询进行 +/-。你知道这对 MSSQL 2016 的性能有何影响吗? - huysentruitw
你的经验可能有所不同,但大致应该相似。 - David Browne - Microsoft
1
刚刚用LINQPad测试了一下,它比分别运行q.Count()q.Skip(x).Take(y)要慢33%。 - huysentruitw
我认为单独运行 Count() 会比两种联合查询形式更好(或不劣)。 - David Browne - Microsoft

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接