Я пытаюсь понять, как groupy by and count работает с linq, но я не могу понять, как делать то, что я хочу.
У меня есть эта таблица:
ASSET:
Id, Code, Name, ParentId
ParentId имеет значение null, если это корень, и содержит родительский идентификатор, если актив связан с другим активом.
Я хотел бы иметь для каждого корневого родителя идентификатор и количество детей
это запрос, который я использовал:
select father.Id, father.Code, COUNT(children.Id) As NumberOfChildren
from Asset father
left join Asset children on(father.Id = children.ParentId)
where father.ParentId IS NULL
group by father.Id, father.Code
это запрос linq, который я делаю
var query = from father in this.assetService.GetAll()
join children in this.assetService.GetAll()
on father.Id equals children.ParentId into Children
from children in Children.DefaultIfEmpty()
where father.ParentId.Value == null
group father by new { id = father.Id, code = father.Code } into gf
select new { id = gf.Key.id, count = gf.Count() };
но объект генерирует этот запрос:
SELECT
1 AS [C1],
[GroupBy1].[K1] AS [Id],
[GroupBy1].[A1] AS [C2]
FROM ( SELECT
[Extent1].[Id] AS [K1],
[Extent1].[Code] AS [K2],
COUNT(1) AS [A1]
FROM [dbo].[Asset] AS [Extent1]
LEFT OUTER JOIN [dbo].[Asset] AS [Extent2] ON [Extent1].[Id] = [Extent2].[ParentId]
WHERE [Extent1].[ParentId] IS NULL
GROUP BY [Extent1].[Id], [Extent1].[Code]
) AS [GroupBy1]
проблема исходит от COUNT(1)
, как я могу сказать, что это должно быть COUNT(children.Id)
COUNT(1)
— это то же самое, что иCOUNT(children.Id)
в исходном SQL-запросе. Фактически,COUNT(1)
будет работать немного быстрее, чемCOUNT(children.Id)
, так как это статическое значение. - person entropic   schedule 16.07.2014COUNTchildren.Id)
, он возвращает 0, но сCOUNT(1)
у меня всегда есть как минимум 1 - person dco   schedule 16.07.2014NULL
.. - person entropic   schedule 16.07.2014