如何 select many 具有多个多对多关系并在 EFCore 中分组

How to select many with multiple many-to-many relationships and group by in 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(),
        ..
    });

但这不允许我 select 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()
    };