여러 조인, 개수 및 왼쪽 조인이 포함된 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>
람다 표현식 변환:
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!