이 SQL이 있다고 가정 해 봅시다.
SELECT p.ParentId, COUNT(c.ChildId)
FROM ParentTable p
LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId
GROUP BY p.ParentId
이것을 LINQ to SQL로 어떻게 번역 할 수 있습니까? COUNT (c.ChildId)에 멈춰 생성 된 SQL이 항상 COUNT (*)를 출력하는 것 같습니다. 내가 지금까지 얻은 것입니다 :
from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1
from j2 in j1.DefaultIfEmpty()
group j2 by p.ParentId into grouped
select new { ParentId = grouped.Key, Count = grouped.Count() }
감사합니다!
답변
from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1
from j2 in j1.DefaultIfEmpty()
group j2 by p.ParentId into grouped
select new { ParentId = grouped.Key, Count = grouped.Count(t=>t.ChildId != null) }
답변
하위 쿼리 사용을 고려하십시오.
from p in context.ParentTable
let cCount =
(
from c in context.ChildTable
where p.ParentId == c.ChildParentId
select c
).Count()
select new { ParentId = p.Key, Count = cCount } ;
쿼리 유형이 연결에 의해 연결되면 다음과 같이 단순화됩니다.
from p in context.ParentTable
let cCount = p.Children.Count()
select new { ParentId = p.Key, Count = cCount } ;
답변
늦은 답변 :
당신은 가입 왼쪽을 필요가 없습니다 당신이하고있는 모든 카운트 인 경우 모두에서 (). 주 join...into
사실로 번역되어 GroupJoin
있는 같은 그룹 반환 new{parent,IEnumerable<child>}
방금 호출 할 필요가 있으므로 Count()
그룹에를 :
from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into g
select new { ParentId = p.Id, Count = g.Count() }
확장 메소드 구문에서 a join into
는 is와 같지만 GroupJoin
( is는 join
없는 into
is Join
) :
context.ParentTable
.GroupJoin(
inner: context.ChildTable
outerKeySelector: parent => parent.ParentId,
innerKeySelector: child => child.ParentId,
resultSelector: (parent, children) => new { parent.Id, Count = children.Count() }
);
답변
LINQ 구문의 기본 개념은 SQL 구문을 에뮬레이트하는 것이지만 SQL 코드를 LINQ로 직접 변환하는 것을 항상 생각해서는 안됩니다. 이 특정 경우에 조인 은 그룹 조인 자체 이기 때문에 그룹에 참여할 필요가 없습니다 .
내 해결책은 다음과 같습니다.
from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into joined
select new { ParentId = p.ParentId, Count = joined.Count() }
여기에서 가장 많이 투표 된 솔루션과 달리 Count (t => t.ChildId! = null) 에서 j1 , j2 및 null 검사 가 필요하지 않습니다 .
답변
(from p in context.ParentTable
join c in context.ChildTable
on p.ParentId equals c.ChildParentId into j1
from j2 in j1.DefaultIfEmpty()
select new {
ParentId = p.ParentId,
ChildId = j2==null? 0 : 1
})
.GroupBy(o=>o.ParentId)
.Select(o=>new { ParentId = o.key, Count = o.Sum(p=>p.ChildId) })