首页 >数据库 >mysql教程 >如何将复杂的SQL查询转换为多个连接,计数并将加入加入LINQ?

如何将复杂的SQL查询转换为多个连接,计数并将加入加入LINQ?

Barbara Streisand
Barbara Streisand原创
2025-01-25 04:43:09715浏览

How to Convert a Complex SQL Query with Multiple Joins, Counts, and Left Joins into LINQ?

将包含多个连接、计数和左连接的复杂SQL查询转换为LINQ

本示例演示如何将包含多个连接和聚合的复杂SQL查询转换为等效的LINQ查询。该查询从三个表(TABLE_C、TABLE_V和TABLE_R)检索数据,并对特定列执行 distinct count 操作。

将SQL转换为LINQ查询理解:

  1. 分组子查询: 将子查询转换为单独声明的变量。在本例中,使用Id和计数的匿名类型对TABLE_R进行分组。
  2. 连接子句: 使用导航属性或匿名对象进行连接,并使用intoDefaultIfEmpty()模拟LEFT JOIN。
  3. GroupBy: 使用匿名类型对多个列的结果进行分组。使用Distinct()对聚合结果进行计数。
  4. Select: 通过创建具有指定字段的匿名类型来选择所需的列。

以下是用查询表达式语法编写的LINQ代码:

<code class="language-csharp">var subrq = from r in Table_R
            group r by r.Id into rg
            select new { Id = rg.Key, cnt = rg.Count() };

var ansq = (from c in Table_C
            join v in Table_V on c.Id equals v.Id
            join r in subrq on c.Id equals r.Id into rj
            from r in rj.DefaultIfEmpty()
            where c.IdUser == "1234"
            group new { c, v, r } by new { c.Id, c.Title, r.cnt } into cvrg
            select new {
                cvrg.Key.Title,
                Nb_V2 = cvrg.Count(),
                Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(),
                Nb_R = (int?)cvrg.Key.cnt
            }).Distinct();</code>

以下是用Lambda表达式语法编写的等效LINQ代码:

<code class="language-csharp">var subr2 = Table_R.GroupBy(r => r.Id).Select(rg => new { Id = rg.Key, cnt = rg.Count() });
var ans2 = Table_C.Where(c => c.IdUser == "1234")
                  .Join(Table_V, c => c.Id, v => v.Id, (c, v) => new { c, v })
                  .GroupJoin(subr2, 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可能为null的情况
                  .Select(cvrg => new { 
                      cvrg.Key.Title, 
                      Nb_V2 = cvrg.Count(), 
                      Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(), 
                      Nb_R = (int?)cvrg.Key.cnt 
                  }).Distinct();</code>

注意Lambda表达式版本中对cvr.r.cnt的处理,添加了?.空条件运算符来处理r可能为null的情况,避免了NullReferenceException异常。 这两种方法都能实现相同的功能,选择哪种方法取决于个人偏好。

以上是如何将复杂的SQL查询转换为多个连接,计数并将加入加入LINQ?的详细内容。更多信息请关注PHP中文网其他相关文章!

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