Как использовать различные с группой в Linq to SQL

Я пытаюсь преобразовать следующий sql в Linq 2 SQL:

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()
    };

Когда я запускаю код, я продолжаю получать Invalid GroupID. Есть идеи? Кажется, что отчетливо закручивается.

Вот сгенерированный 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]

Ответ 1

Я думаю, что Basiclife близок, но проверка того, является ли id пустым, может не быть проблемой или достаточно, вы должны проверить, чтобы убедиться, что она не является нулевой, прежде чем делать группу, так как вы сказали, что это поле с нулевым значением. В противном случае это выглядит правильно, и если у вас возникли проблемы, у вас могут быть плохие данные, или это ошибка или не полностью реализована функция Linq to SQL, и вы можете попробовать Linq to Entity.

var q = from i in ProcessRoundIssueInstance
        where i.GroupID != null
        && i.GroupID != string.Empty
        group i by i.GroupID into g        
        select new
        {
            Key = g.Key,
            Count = g.Select(x => x.UserID).Distinct().Count()
        };

Ответ 3

Кажется, что в сгенерированном SQL имеется целая куча goop, чтобы иметь дело с идентификатором GroupID равным NULL. Если это возможно? ЕСЛИ нет, попробуйте изменить определение, чтобы оно не было NULL.

Ответ 4

Попробуйте предложение 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()
    };

Ответ 5

Вы уверены в правильности целостности базы данных? В любом случае, вы должны попробовать: Я не знаю, как группа будет пустой, но это, кажется, ваша проблема.

ProcessRoundIssueInstance.Where(i => i.GroupId != null)
    .GroupBy(i => i.GroupID)
    .Select(group => new 
                    { 
                      Key = group.Key,
                      Count = group.SingleOrDefault() == null ? 0 : 
                              group.SingleOrDefault().Select( item => item.UserID).Distinct().Count() 
                     });