如何在EFCore中选择具有多个多对多关系的多个并按分组



假设我们有模型A、B和C。A与B和C有多对多关系。我想创建以下聚合:

+--------+----------------+--------------+---------+
|  a_id  |  b_value_sum   | c_value_sum  | c_count |
+--------+----------------+--------------+---------+
| 1      |  20            | 10           | 40      | 
+--------+----------------+--------------+---------+

所以对于每个A,我想求出每个b和c的值性质的和,以及所有c的值。

我第一次尝试:

dbContext.A
.Include(x => x.B)
.Include(x => x.C)
.GroupBy(x => x.Id)
.Select(g => new
{
Id = g.Key.ToString(),
..
});

但这不允许我选择B或C的任何值。

我也试过:

context.A
.SelectMany(y => y.B)
.SelectMany(z => z.C)
.Select(v => new { Id = y.Id, ValueB = z.Value, ValueC = v.Value})
.GroupBy(x => x.Id)
.Select(g => new
{
Id = g.Key.ToString(),
ValueBSum = g.Sum(y => y.ValueB),
ValueCSum = g.Sum(y => y.ValueC),
ValueCCount = g.Count()
});

但这不起作用,因为z是B型而不是A型。

如何达到预期效果有什么想法吗?

对此类查询使用查询语法。它可读性更强,易于维护。

var query = 
from a in context.A
from b in a.B
from c in b.C.DefaultIfEmpty() // LEFT JOIN
group new { b, c } by a.Id into g
select new
{
Id = g.Key.ToString(),
ValueBSum = g.Sum(y => y.b.Value),
ValueCSum = g.Sum(y => y.c.Value),
ValueCCount = g.Count()
};

最新更新