如何 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()
};
假设我们有模型 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()
};