Я пытаюсь преобразовать следующий SQL в SQL Linq 2:
select groupId, count(distinct(userId)) from processroundissueinstance
group by groupId
Вот мой код:
var q = from i in ProcessRoundIssueInstance
group i by i.GroupID into g
select new
{
Key = g.Key,
Count = g.Select(x => x.UserID).Distinct().Count()
};
Когда я запускаю код, я продолжаю получать неверный идентификатор группы. Любые идеи? Кажется, что всё портит…
Вот сгенерированный sql:
SELECT [t1].[GroupID] AS [Key], (
SELECT COUNT(*)
FROM (
SELECT DISTINCT [t2].[UserID]
FROM [ProcessRoundIssueInstance] AS [t2]
WHERE (([t1].[GroupID] IS NULL) AND ([t2].[GroupID] IS NULL))
OR (([t1].[GroupID] IS NOT NULL)
AND ([t2].[GroupID] IS NOT NULL)
AND ([t1].[GroupID] = [t2].[GroupID]))
) AS [t3]
) AS [Count]
FROM (
SELECT [t0].[GroupID]
FROM [ProcessRoundIssueInstance] AS [t0]
GROUP BY [t0].[GroupID]
) AS [t1]
Попробуйте использовать предложение where для устранения ложных идентификаторов после соединения...
var q = from i in ProcessRoundIssueInstance
where i.GroupID != ""
group i by i.GroupID into g
select new
{
Key = g.Key,
Count = g.Select(x => x.UserID).Distinct().Count()
};
Согласно этому сообщению, ваш код выглядит правильно:
LINQ to SQL с использованием GROUP BY и COUNT(DISTINCT)
Вы пробовали проверить сгенерированный SQL?
Похоже, что в сгенерированном SQL содержится целая куча ошибок, связанных с тем, что GroupID равен NULL. Если это возможно? ЕСЛИ нет, попробуйте изменить определение, чтобы оно НЕ было NULL.