Допустим, у меня есть этот 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() }
Спасибо!
c#
.net
linq
linq-to-sql
PBZ
источник
источник
Рассмотрите возможность использования подзапроса:
Если типы запросов связаны ассоциацией, это упрощается до:
источник
let
ключевым словом сгенерирует подзапрос так же, как и решение, объединенное с группой @Mosh.ПОЗДНО ОТВЕТ:
Вам вообще не нужно левое соединение, если все, что вы делаете, это Count (). Обратите внимание, что
join...into
на самом деле переводится наGroupJoin
возвращаемые группировки,new{parent,IEnumerable<child>}
так что вам просто нужно вызватьCount()
группу:В Синтаксисе метода расширения a
join into
эквивалентноGroupJoin
(а ajoin
безinto
isJoin
):источник
Хотя идея синтаксиса LINQ заключается в том, чтобы эмулировать синтаксис SQL, вы не всегда должны думать о прямом переводе своего кода SQL в LINQ. В данном конкретном случае нам не нужно делать group into, так как join into - это само присоединение группы.
Вот мое решение:
В отличие от решения с большинством голосов, мы здесь не нуждаемся в проверке j1 , j2 и нуля в Count (t => t.ChildId! = Null)
источник
источник