首页 >数据库 >mysql教程 >如何将具有多个联接、COUNT 和左联接的复杂 SQL 查询转换为其 LINQ 等效查询?

如何将具有多个联接、COUNT 和左联接的复杂 SQL 查询转换为其 LINQ 等效查询?

Patricia Arquette
Patricia Arquette原创
2025-01-25 04:21:08666浏览

How to translate a complex SQL query with multiple joins, COUNT, and a left join into its LINQ equivalent?

将包含多个连接、COUNT 和左连接的 SQL 转换为 LINQ

给定的 SQL 查询包含多个连接(包括左连接)以及使用 COUNT 和 COUNT(DISTINCT) 函数的聚合。目标是将此查询转换为其 LINQ 等效项,用于应用程序的数据访问层。

SQL 查询:

<code class="language-sql">SELECT DISTINCT c.Id, 
       c.Title, 
       COUNT(v.Id) AS 'Nb_V2',
       COUNT(DISTINCT v.IdUser) AS 'Nb_V1',
       r.cnt AS 'Nb_R'
FROM TABLE_C c
JOIN TABLE_V v on c.Id = v.Id
LEFT JOIN ( 
    SELECT Id, COUNT(*)  AS cnt 
    FROM TABLE_R 
    GROUP BY Id
) r ON c.Id = r.Id
WHERE c.IdUser = '1234'
GROUP BY c.Id, c.Title, r.cnt</code>

LINQ 查询理解:

将 SQL 查询转换为 LINQ 查询理解的一种方法是使用嵌套连接和匿名类型分组。但是,将 COUNT 和 COUNT(DISTINCT) 函数转换为 LINQ 语法可能具有挑战性。

Lambda 表达式:

可以使用 lambda 表达式实现 LINQ 转换的更简洁的解决方案。通过利用 join...selectMany 操作和分组,可以将查询编写如下:

<code class="language-csharp">var ans2 = Table_C.Where(c => c.IdUser == "1234")
                  .Join(Table_V, c => c.Id, v => v.Id, (c, v) => new { c, v })
                  .GroupJoin(Table_R.GroupBy(r => r.Id).Select(rg => new { Id = rg.Key, cnt = rg.Count() }), cv => cv.c.Id, r => r.Id, (cv, rj) => new { cv.c, cv.v, rj })
                  .SelectMany(cvrj => cvrj.rj.DefaultIfEmpty(), (cvrj, r) => new { cvrj.c, cvrj.v, r })
                  .GroupBy(cvr => new { cvr.c.Id, cvr.c.Title, cvr.r?.cnt }) //处理r可能为空的情况
                  .Select(cvrg => new { 
                      cvrg.Key.Title, 
                      Nb_V2 = cvrg.Count(), 
                      Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(), 
                      Nb_R = cvrg.Key.cnt 
                  });</code>

翻译指南:

为了有效地将 SQL 查询转换为 LINQ,可以应用以下指南:

  • 除非子选择引用外部列,否则应独立转换子选择。
  • 单个单子运算符和聚合运算符可以直接应用于 LINQ 查询的结果。
  • 匿名类型用于表示多列。
  • 连接子句由导航属性或匿名对象表示。
  • 左连接需要使用 GroupJoin...SelectMany。 注意处理r可能为空的情况,在GroupBySelect中添加了相应的空值检查。

This revised answer improves the LINQ query by handling the potential null value of r.cnt in the GroupBy and Select clauses, making it more robust. The comment explains this change. The rest of the explanation remains the same, providing a clear and accurate translation guide from SQL to LINQ.

以上是如何将具有多个联接、COUNT 和左联接的复杂 SQL 查询转换为其 LINQ 等效查询?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn