복붙노트

[SQL] 복수와 LINQ에 SQL 조인, 왼쪽 카운트 조인

SQL

복수와 LINQ에 SQL 조인, 왼쪽 카운트 조인

나는 (가입 왼쪽 포함) 다수가 가입하여이 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

그러나 '이드이 요청의 Linq에 해당하는처럼, 그것을 내 응용 프로그램의 데이터 액세스 레이어를 넣어.

뭔가 같은 시도 :

var qResult = from c in dbContext.TABLE_C
              join v in dbContext.TABLE_V on c.IdC equals v.IdC
              join r in dbContext.TABLE_R on v.IdC equals r.IdC into temp
              from x in temp.DefaultIfEmpty()
              group x by new { c.IdC, c.Title /*miss something ?*/} into grouped
              select new
              {
                  IdC = grouped.Key.IdC,          --good result
                  Title = grouped.Key.Title,      --good result
                  NbR = grouped.Distinct().Count(t => t.IdC > 0), --good, but "t.Id > 0" seems weird
                  Count = --I'm lost. No idea how to get my COUNT(...) properties (Nb_V1 and Nb_V2)
              };

나는이 SO 질문에 적응하기 위해 노력하지만 난 그것을 알아낼 수 없습니다. I는 그룹화 된 하위 요청 내부의 개수와 잃었어요. 내가 틀렸다 어디 사람이 나를 설명 할 수 있습니까?

프로 팁 : 보너스 포인트는 누군가 람다 식에 해당 쓸 수있는 경우

해결법

  1. ==============================

    1.LINQ 쿼리의 이해에 SQL을 번역하는 경우 :

    LINQ 쿼리의 이해에 SQL을 번역하는 경우 :

    당신의 SQL 쿼리에이 규칙을 적용, 당신은 얻을 :

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

    람다 번역은 까다로운이지만, 왼쪽의 변환은 GroupJoin에 가입 ... SelectMany가 필요한 것입니다 :

    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 });
    
  2. from https://stackoverflow.com/questions/49245160/sql-to-linq-with-multiple-join-count-and-left-join by cc-by-sa and MIT license