> 데이터 베이스 > MySQL 튜토리얼 > 여러 조인, 개수 및 왼쪽 조인이 포함된 복잡한 SQL 쿼리를 LINQ로 변환하는 방법은 무엇입니까?

여러 조인, 개수 및 왼쪽 조인이 포함된 복잡한 SQL 쿼리를 LINQ로 변환하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2025-01-25 04:18:08
원래의
322명이 탐색했습니다.

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

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

SQL 쿼리는 다중 조인, 왼쪽 조인 및 집계 함수를 사용하여 여러 테이블에서 데이터를 검색합니다. 이 쿼리를 LINQ로 변환하려면 다음 단계를 따르세요.

  • 하위 쿼리 변환: 하위 쿼리가 하위 쿼리 외부의 열을 참조하지 않는 한 하위 쿼리를 별도의 변수로 추출합니다.
  • 테이블 별칭 사용: 테이블 별칭을 범위 변수로 사용하고 열 별칭을 익명 유형 필드 이름으로 사용합니다.
  • 조인 처리: EF/EF Core를 사용하는 경우 JOIN 절을 탐색 속성으로 변환하세요. 그렇지 않으면 익명 개체나 교차 조인, WHERE 및 LEFT JOIN 시뮬레이션을 사용하세요.
  • 집계 함수: COUNT와 같은 SQL 집계 함수 대신 LINQ 집계 함수를 사용하세요.
  • Distinct(): DISTINCT를 변환하려면 Distinct() 메서드를 사용하세요.
  • LEFT JOIN: into, from 및 DefaultIfEmpty()를 사용하여 LEFT JOIN을 시뮬레이션합니다.
  • 익명 유형: 익명 유형을 사용하여 여러 열을 결합합니다.

원래 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_VdbContext.TABLE_R을 조정해야 합니다.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿