我正在对代码执行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
子句以包含来自不同实体的列。
答案 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列分组时,你无法做任何其他事情。