將包含多個連接、計數和左連接的SQL查詢轉換為LINQ
您的SQL查詢使用了多個連接、左連接和聚合函數來從多個表中檢索數據。要將此查詢轉換為LINQ,請按照以下步驟操作:
原始SQL查詢:
<code class="language-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</code>
LINQ查詢表達式轉換(改進版):
<code class="language-csharp">var qResult = (from c in dbContext.TABLE_C join v in dbContext.TABLE_V on c.Id equals v.Id from r in dbContext.TABLE_R.Where(r => r.Id == c.Id).DefaultIfEmpty() where c.IdUser == "1234" group new { c, v, r } by new { c.Id, c.Title } into grouped select new { IdC = grouped.Key.Id, Title = grouped.Key.Title, Nb_V2 = grouped.Count(g => g.v.Id != null), Nb_V1 = grouped.Select(g => g.v.IdUser).Distinct().Count(), Nb_R = grouped.Sum(g => (int?)g.r.cnt ?? 0) // 处理r.cnt可能为null的情况 }).Distinct();</code>
Lambda表達式轉換:
<code class="language-csharp">var ansq = dbContext.TABLE_C .Where(c => c.IdUser == "1234") .Join(dbContext.TABLE_V, c => c.Id, v => v.Id, (c, v) => new { c, v }) .GroupJoin(dbContext.TABLE_R, cv => cv.c.Id, r => r.Id, (cv, r) => new { cv, r }) .SelectMany(x => x.r.DefaultIfEmpty(), (x, r) => new { x.cv.c, x.cv.v, r }) .GroupBy(x => new { x.c.Id, x.c.Title, cnt = (int?)x.r?.cnt }) .Select(g => new { g.Key.Title, Nb_V2 = g.Count(x => x.v.Id != null), Nb_V1 = g.Select(x => x.v.IdUser).Distinct().Count(), Nb_R = g.Key.cnt }) .Distinct(); </code>
這個改進後的LINQ查詢更簡潔高效地處理了COUNT函數和LEFT JOIN,並避免了原代碼中的一些潛在問題,例如t.Id > 0
的奇怪判斷以及r.cnt
可能為null的情況。 它更準確地反映了原始SQL查詢的邏輯。 請注意,你需要根據你的數據庫上下文和實體名稱調整dbContext.TABLE_C
,dbContext.TABLE_V
和 dbContext.TABLE_R
。
以上是如何將具有多個聯結、計數和左聯接的複雜 SQL 查詢轉換為 LINQ?的詳細內容。更多資訊請關注PHP中文網其他相關文章!