Опитвам се да разбера как groupy by и count работи с linq, но не мога да разбера как да направя това, което искам.
Имам тази таблица:
ASSET:
Id, Code, Name, ParentId
ParentId е null, ако е коренът, и съдържа родителския идентификатор, ако активът е свързан с друг актив
Бих искал да имам за всеки основен родител ID и броя на децата
това е заявката, която използвах:
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