首頁 >資料庫 >mysql教程 >如何將復雜的SQL查詢轉換為多個連接,計數並將加入加入LINQ?

如何將復雜的SQL查詢轉換為多個連接,計數並將加入加入LINQ?

Barbara Streisand
Barbara Streisand原創
2025-01-25 04:43:09758瀏覽

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