【问题标题】:Linq To Entities Group By with multiple tables in keyLinq To Entities Group By,键中有多个表
【发布时间】:2016-03-08 18:03:49
【问题描述】:

表结构如下:

TableB TableA 1---> TableC

我需要在 Linq to EF 中运行一个查询来执行此操作:

SELECT SUM(TableC.SomeColumn)
FROM TableA a
  INNER JOIN TableB b
    ON a.Id = b.fkAId
  INNER JOIN TableC c
    ON a.Id = c.fkAId

WHERE <some_conditions>

GROUP BY c.Col2, c.Col3, b.Col5

到目前为止,我有这个,但我不知道如何在 group by 中指定表 b 列。它需要流畅而不是 LINQ SQL 风格的表达。

var res = TableCs.Where(c =>
c.TableA.TableBs.Any(b => b.Col5 == "SomeValue") &&
.
.
.
)

.GroupBy(c => new { c.Col2, c.Col3, b.<***how to I get to b column here***>})
.Select(gr => new 
{
.
.
.
})

我可以从 A 中选择列,因为只有一个 A 导航属性,但是当我导航到最后一站的集合时,我无法想象如何到达 B 列。

有谁知道如何将这些 TableB 列用于 GroupBy 键??

【问题讨论】:

    标签: c# entity-framework linq group-by fluent


    【解决方案1】:

    分组前,需要使用允许投影的Queryable.SelectMany overload,像这样

    var query =
        TableCs.SelectMany(c => c.TableA.TableBs
            .Where(b => b.Col5 == "SomeValue"
                // && ...
            ),
            (c, b) => new { c, b }
        )
        .GroupBy(r => new { r.c.Col2, r.c.Col3, r.b.Col5 })
        .Select(g => new
        {
            g.Key.Col2,
            g.Key.Col3,
            g.Key.Col5,
            SomeColumnC = g.Sum(r => r.c.SomeColumn),
            SomeColumnB = g.Sum(r => r.b.SomeColumn)
            // ...
        });
    

    【讨论】:

    • 非常感谢。我知道我必须使用 SelectMany,但想象一下如何投影出来以选择列是我得到列表的地方。我看到额外的参数 (c, b) => new { c, b } 是关键 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 2015-06-24
    • 2010-12-31
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多