Как использовать разные с group by в Linq to SQL - PullRequest
11 голосов
/ 27 августа 2010

Я пытаюсь преобразовать следующий 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()
    };

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

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

Ответы [ 5 ]

5 голосов
/ 25 октября 2010

Я думаю, что Basiclife близок, но проверка того, является ли идентификатор пустым, может быть проблемой или недостаточной, вы должны убедиться, что он не равен NULL, прежде чем приступить к работе с группой, так как вы сказали, что это поле, допускающее пустые значения. В противном случае это выглядит правильно, и если у вас есть проблемы, у вас могут быть неверные данные, или это ошибка или не полностью реализованная функция 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()
        };
0 голосов
/ 23 мая 2011

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

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() 
                     });
0 голосов
/ 27 августа 2010

Кажется, что в сгенерированном SQL есть целая куча ошибок, чтобы GroupID был NULL. Если это возможность? Если нет, попробуйте изменить определение, чтобы оно НЕ было ПУСТО.

0 голосов
/ 27 августа 2010

Попробуйте условие 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()
    };
0 голосов
/ 27 августа 2010

Согласно этому посту, ваш код выглядит правильно:

LINQ to SQL с использованием GROUP BY и COUNT (DISTINCT)

Вы пытались проверить генерируемый SQL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...