>데이터 베이스 >MySQL 튜토리얼 >여러 조인, 카운트 및 왼쪽 결합으로 복잡한 SQL 쿼리를 LINQ로 변환하는 방법은 무엇입니까?

여러 조인, 카운트 및 왼쪽 결합으로 복잡한 SQL 쿼리를 LINQ로 변환하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2025-01-25 04:43:09717검색

How to Convert a Complex SQL Query with Multiple Joins, Counts, and Left Joins into LINQ?

여러 조인, 개수 및 왼쪽 조인이 포함된 복잡한 SQL 쿼리를 LINQ로 변환

이 예에서는 여러 조인과 집계가 포함된 복잡한 SQL 쿼리를 동등한 LINQ 쿼리로 변환하는 방법을 보여줍니다. 이 쿼리는 세 개의 테이블(TABLE_C, TABLE_V 및 TABLE_R)에서 데이터를 검색하고 특정 열에 대해 고유한 카운트 작업을 수행합니다.

SQL을 LINQ 쿼리 이해로 변환:

  1. 그룹 하위 쿼리: 하위 쿼리를 개별적으로 선언된 변수로 변환합니다. 이 예에서 TABLE_R은 익명 유형의 Id 및 Count를 사용하여 그룹화됩니다.
  2. Join 절: 탐색 속성이나 익명 개체를 사용하여 조인하고 intoDefaultIfEmpty()을 사용하여 LEFT JOIN을 시뮬레이션합니다.
  3. GroupBy: 익명 유형을 사용하여 여러 열의 결과를 그룹화합니다. 집계된 결과를 계산하려면 Distinct()을 사용하세요.
  4. 선택: 지정된 필드로 익명 유형을 생성하여 필수 열을 선택합니다.

다음은 쿼리 표현식 구문으로 작성된 LINQ 코드입니다.

<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() };

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>

다음은 Lambda 식 구문으로 작성된 동등한 LINQ 코드입니다.

<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(subr2, 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可能为null的情况
                  .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 
                  }).Distinct();</code>

Lambda 표현식 버전에서 cvr.r.cnt 처리에 주의하세요. ?. null 조건 연산자가 추가되어 r이 null일 수 있는 상황을 처리하여 NullReferenceException 예외를 방지합니다. 두 방법 모두 동일한 기능을 수행하며 어떤 방법을 선택하는지는 개인 취향에 따라 결정됩니다.

위 내용은 여러 조인, 카운트 및 왼쪽 결합으로 복잡한 SQL 쿼리를 LINQ로 변환하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.