LINQ to Entites按属于多个实体的列进行分组

时间:2015-06-24 15:22:32

标签: c# linq entity-framework

我正在对代码执行SQL to LINQ返工。

我必须向LINQ翻译如下的查询:

SELECT COUNT(*) AS NUM, A.a1, GROUP_CONCAT(A.a2)... A.an, B.b1... B.bn... etc
FROM A LEFT JOIN B ON ...
       LEFT JOIN C ON ...

GROUP BY A.a1, A.a3.....B.b1
HAVING NUM > 1

请注意,我在GROUP BY子句中故意省略了A.a2。查询确实找到仅由单个字段区分的重复记录。因此,在MySQL中,我必须将实体(JOIN)投影到一行中,从中合并相同的行(GROUP BY)。在SQL Server中,上述语句非常复杂。

我相信这在LINQ to Entities中是一项非常简单的任务,但我还没有理解我如何在不同实体的上实际执行连接。< / p>

我的意思是LINQ group x by y into g语法要求单个实体成为分组的对象。

我的查询以典型的

开头
from A a in db.a
join B b in db.b.DefaultIfEmpty() on ... equals ...
join C c in db.c.DefaultIfEmpty() on ... equals ...

但是我还不知道如何编写group子句以包含来自不同实体的列。

1 个答案:

答案 0 :(得分:1)

我完成了我的作业,发现了可行的语法。以下是我想要分享的有效语法

from A a in db.a
join B b in db.b.DefaultIfEmpty() on ... equals ...
join C c in db.c.DefaultIfEmpty() on ... equals ...

select new {a1 = a.a1, a2 = a.a2 ..... c1 = c.c1 ...} into j
group j by new { j.a1, j.a3, j.a4 ... j.c1 ... j.cn} into g
where g.Count() > 1

select new ...;

说明:根据语法,在this article into子句&#34中更好地解释;创建一个临时范围变量,您可以在进一步的操作中使用&#34;,实际上重置查询语法环境。

这意味着尽管每个查询都以select终止,但使用select ... into实际上允许select的输出自动为全新查询的from。括号也可以达到同样的效果。

以上代码是一种简化。我的特定查询有100个字段要分组(是,100),这看起来是最短的语法。

变得困惑的可能性增长,但当你需要按100列分组时,你无法做任何其他事情。