將包含多個連接、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,可以應用以下指南:
r
可能為空的情況,在GroupBy
和Select
中加入了對應的空值檢查。 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中文網其他相關文章!