[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.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 });
from https://stackoverflow.com/questions/49245160/sql-to-linq-with-multiple-join-count-and-left-join by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL은 어떻게 범위에없는 날짜를 채우기 위해? (0) | 2020.03.06 |
---|---|
[SQL] 신원 증가는 SQL Server 데이터베이스에 점프 (0) | 2020.03.06 |
[SQL] 오라클에서 여러 행에서 CONCATENATE 열 값에 SQL 쿼리 (0) | 2020.03.06 |
[SQL] 어떻게 데이터베이스 인덱싱 작업을합니까? [닫은] (0) | 2020.03.06 |
[SQL] 값이 존재하지 않는 경우에만 반환 행 (0) | 2020.03.06 |