Linq Group By Count один столбец - PullRequest
       1

Linq Group By Count один столбец

1 голос
/ 16 сентября 2011

У меня есть мой linq, как показано ниже:

from ucd in UserCategoryDetails
join uc in UserCategories on ucd.UserCategoryDetailsID equals
        uc.UserCategoryDetailsID into ucj from uc in ucj.DefaultIfEmpty()
join uct in UserCategoryTypes on ucd.UserCategoryTypeID equals
        uct.UserCategoryTypeID
join cc in UserCategoryColours on ucd.UserCategoryColourID equals 
         cc.UserCategoryColourID
where 
        ucd.UserCategoryTypeID == 2 && 
        ucd.UserID == 1
group ucd by new { 
        ucd.UserCategoryDetailsID, 
        ucd.CategoryName, 
        cc.UserCategoryColourID, 
        cc.ImageSrcLarge, 
        cc.ImageSrcSmall 
    } into g
select new  {
        UserCategoryDetailsID = g.Key.UserCategoryDetailsID,
        CategoryName = g.Key.CategoryName,
        CategoryColourID = g.Key.UserCategoryColourID,
        ImageSrcLarge = g.Key.ImageSrcLarge,
        ImageSrcSmall = g.Key.ImageSrcSmall,
        CategoryCount = g.Count()
}

Проблема в том, что sql, генерируемый Count(), равен COUNT(*), что приводит к путанице в результатах, так как возвращает 1, когда в UserCategories нет строк.

Может кто-нибудь показать мне, как сгенерировать эквивалент LINQ COUNT(uc.ProjectID), пожалуйста? В основном следующий оператор SQL, но в linq:

SELECT 
    [t0].[UserCategoryDetailsID], [t0].[CategoryName], 
    [t3].[UserCategoryColourID], [t3].[ImageSrcLarge], 
    [t3].[ImageSrcSmall], COUNT([t1].ProjectID) AS [CategoryCount]
FROM 
    [UserCategoryDetails] AS [t0]
        LEFT OUTER JOIN [UserCategory] AS [t1] ON 
            [t0].[UserCategoryDetailsID]) = [t1].[UserCategoryDetailsID]
        INNER JOIN [UserCategoryType] AS [t2] ON 
            [t0].[UserCategoryTypeID] = [t2].[UserCategoryTypeID]
        INNER JOIN [UserCategoryColour] AS [t3] ON 
            [t0].[UserCategoryColourID] = [t3].[UserCategoryColourID]
WHERE 
    ([t0].[UserCategoryTypeID] = 2) AND ([t0].[UserID] = 1)
GROUP BY 
    [t0].[UserCategoryDetailsID], [t0].[CategoryName], 
    [t3].[UserCategoryColourID], [t3].[ImageSrcLarge], 
    [t3].[ImageSrcSmall]

Ответы [ 2 ]

0 голосов
/ 19 сентября 2011

Я понял это. Казалось бы, поскольку он делал COUNT(*), он возвращал бы null, когда идентификатор проекта был нулевым, как упоминал Джей. Это будет выглядеть как 1 в подсчете, что испортит результаты.

Изменение части подсчета для выбора ниже хорошо работает:

CategoryCount = g.Where(grp => grp != null).Count()

Спасибо за ваши ответы

0 голосов
/ 17 сентября 2011

Конечно, я могу ошибаться, но мне кажется, что ваш запрос LINQ COUNT(*) работает с группировкой, а не с UserCategory.

Что произойдет, если вы замените g.Count() на uc.Count()?

COUNT(*) не вернет 1, если в таблице нет строк. COUNT(ProjectId) будет ниже, чем COUNT(*), только если в таблице 1 или более строк, а столбец ProjectId равен NULL в одной или нескольких из этих строк.

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