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

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

DDD
DDD원래의
2025-01-25 04:10:09714검색

How to Translate Complex SQL Queries with Multiple Joins, Counts, and Left Joins into LINQ?

복잡한 다중 테이블 조인, 개수 및 왼쪽 조인 SQL 쿼리를 LINQ로 변환

기존 SQL 쿼리에 복합 조인, 개수 및 왼쪽 조인이 포함된 경우 이를 동등한 LINQ 식으로 변환해야 합니다. 프로세스를 세분화하고 직면한 특정 문제를 해결해 보겠습니다.

변환 규칙 이해

SQL을 LINQ로 변환하려면 관련된 특정 변환 규칙을 이해해야 합니다. 몇 가지 주요 원칙은 다음과 같습니다.

  • 별도의 하위 쿼리는 별도의 변수로 변환할 수 있지만, 외부 열을 참조하는 하위 쿼리에는 괄호가 필요합니다.
  • 조인 절은 테이블 별칭과 등호 조건을 결합하여 표현할 수 있습니다.
  • 왼쪽 조인은 탐색 속성과 DefaultIfEmpty() 메서드를 사용하여 구현됩니다.
  • 집계 함수 및 개수는 LINQ 집계(예: Count(), Distinct().Count())를 사용하여 구현할 수 있습니다.

SQL 쿼리 변환

제공된 SQL 쿼리를 고려하여 먼저 개수 계산을 위한 하위 쿼리를 정의합니다.

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

이제 주요 검색어는 다음과 같습니다.

<code class="language-csharp">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>

이 LINQ 식은 필요한 조인, 그룹화 및 계산 작업을 수행합니다.

람다식 변환

람다 표현식을 변환하려면 GroupJoin()SelectMany() 메서드를 사용하여 왼쪽 조인을 처리할 수 있습니다.

<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(subr, 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 })
                  .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 });</code>

이 람다 스타일 표현식은 쿼리 이해와 동일한 작업을 수행합니다.

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

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