首頁 > 資料庫 > mysql教程 > 如何使用多個連接,計數和左連接到LINQ等效的複雜SQL查詢?

如何使用多個連接,計數和左連接到LINQ等效的複雜SQL查詢?

Patricia Arquette
發布: 2025-01-25 04:21:08
原創
702 人瀏覽過

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 查詢:

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
登入後複製

LINQ 查詢理解:

將 SQL 查詢轉換為 LINQ 查詢理解的一種方法是使用巢狀連接和匿名類型分組。但是,將 COUNT 和 COUNT(DISTINCT) 函數轉換為 LINQ 語法可能具有挑戰性。

Lambda 表達式:

可以使用 lambda 表達式實現 LINQ 轉換的更簡潔的解決方案。透過利用 join...selectMany 操作和分組,可以將查詢編寫如下:

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

翻譯指引:

為了有效地將 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 exprobusts this . The , providing a clear and accurate translation guide from SQL to LINQ.

以上是如何使用多個連接,計數和左連接到LINQ等效的複雜SQL查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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