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

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

DDD
發布: 2025-01-25 04:10:09
原創
701 人瀏覽過

How to Translate Complex SQL Queries with Multiple Joins, Counts, and Left Joins into LINQ?

將復雜的多表連接、計數和左連接SQL查詢轉換為LINQ

當您的現有SQL查詢涉及復雜連接、計數和左連接時,就需要將其轉換為等效的LINQ表達式。讓我們分解這個過程,並解決遇到的具體挑戰。

理解轉換規則

將SQL轉換為LINQ需要理解所涉及的特定轉換規則。一些關鍵原則包括:

  • 獨立的子查詢可以轉換為單獨的變量,而引用外部列的子查詢需要括號。
  • 連接子句可以通過組合表別名和相等條件來表示。
  • 左連接是使用導航屬性和DefaultIfEmpty()方法實現的。
  • 聚合函數和計數可以使用LINQ聚合(例如,Count()Distinct().Count())來實現。

SQL查詢的轉換

考慮提供的SQL查詢,我們首先定義用於計算計數的子查詢:

<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() };</code>
登入後複製

現在,對於主查詢:

<code class="language-csharp">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>
登入後複製

此LINQ表達式執行必要的連接、分組和計數操作。

Lambda表達式的轉換

對於lambda表達式的轉換,我們可以使用GroupJoin()SelectMany()方法來處理左連接:

<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(subr, 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 })
                  .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 });</code>
登入後複製

此lambda風格的表達式與查詢理解實現相同的任務。

以上是如何使用多個連接,計數並將加入加入LINQ轉換複雜的SQL查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板