对联接到另一个需要分组的IQueryable的IQueryable进行LINQ操作?

时间:2019-08-15 13:50:58

标签: c# linq

考虑三个IQueryable:tableA,tableB和tableC。 它们都有3个值的组合键a,b和c。 我将需要获取tableB,d中一列的总和,并按a,b和c进行分区。如何将三个表连接在一起以得到准确的分区来选择新对象?我的编译器总是显示错误。

这是我尝试过的基本查询:

from A in tableA
join B in tableB on new { A.a, A.b, A.c } equals new { B.a, B.b, B.c } into p1
group B by new  { B.a, B.b, B.c } into p2

from q2 in p2
join C in tableC on new { A.a, A.b, A.c }  equals new { C.a, C.b, C.c }  into p3

from results in p3
select new NewObject
{
    Column1 = p3.A.a,
    Column2 = p3.A.b,
    Column3 = p3.A.c,
    Column4 = Sum(p3.C.d),
    Column5 = p3.B.e
};

我得到了一个关于模棱两可的调用的漫长错误,并且到处都有红线。我想我不太确定如何通过IQueryable对一个组进行多个联接。那有可能吗?

1 个答案:

答案 0 :(得分:0)

我认为在这种情况下,您的查询可以通过简化联接,使用所有必需的列编写选择内容,然后按如下方式使用流畅的API来受益。我相信这个查询会达到您想要的结果。

var model = (from A in tableA
             join B in tableB on new { A.a, A.b, A.c } equals new { B.a, B.b, B.c }
             join C in tableC on new { A.a, A.b, A.c }  equals new { C.a, C.b, C.c }
             select new {
                 Aa = A.a,
                 Ab = A.b,
                 Ac = A.c,
                 Ba = B.a,
                 Bb = B.b,
                 Bc = B.c,
                 Be = B.e,
                 Ca = C.a,
                 Cb = C.b,
                 Cc = C.c,
                 Cd = C.d
             })
             .GroupBy(x => new {x.Ba, x.Bb, x.Bc})
             .Select(grp => new {
                 Column1 = grp.First().Aa,
                 Column2 = grp.First().Ab,
                 Column3 = grp.First().Ac,
                 Column4 = grp.Sum(y => y.Cd),
                 Column5 = grp.First().Be
             }).ToList();