使用Linq to SQL在一个查询中使用多个聚合函数

Spo*_*ook 0 c# linq entity-framework aggregate-functions

我试图在LINQ(EF6)中实现以下功能:

SELECT count(A), sum(B), average(C)
FROM TableA,
LEFT JOIN TableB ON ...
LEFT JOIN TableC ON ...
WHERE
    (very complicated conditions)
Run Code Online (Sandbox Code Playgroud)

C#代码如下所示:

IQueryable<Entity> = dbSet
    .Include(e => e.entityB)
    .Include(e => e.EntityC)
    .Where( <very complicated conditions> );
Run Code Online (Sandbox Code Playgroud)

如何在不同的字段上应用多个聚合函数?具体来说,在某种程度上,这不会导致复杂的条件在结果查询中反复复制?

Iva*_*oev 6

您可以通过常量技巧使用来获取具有单个SQL查询(以及共享复杂过滤器)的所有聚合:

var result = dbSet
    .Where( <very complicated conditions> )
    .GroupBy(e => 1) // aribitrary value
    .Select(g => new
    {
        CountA = g.Count(),
        SumB = g.Sum(e => e.EntityB.PropertyB),
        AverageC = g.Average(e => e.EntityC.PropertyC),
    })
    .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)