2011-09-16 103 views
1

我有我的LINQ如下:的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() 
} 

麻煩的是Count()生成SQL是COUNT(*),這是搞亂的結果,因爲它返回1時,在沒有行UserCategories。

有人可以告訴我如何生成COUNT(uc.ProjectID)的LINQ等價物嗎?基本上,下面的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] 
+0

這是LINQ到SQL或LINQ到實體?這些對象是否具有彼此之間的導航屬性? –

回答

0

我想通了。這似乎是因爲它在做COUNT(*),如Jay所述,當項目ID爲空時它會返回null。這將在計數中被視爲1,並將結果搞砸。

改變選擇的計數部分下面的作品很好:

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

感謝您的答覆

0

我可能是錯誤的,當然,但在我看來像你的LINQ查詢的COUNT(*)是在分組操作,而不是UserCategory

如果將g.Count()替換爲uc.Count(),會發生什麼情況?

COUNT(*)如果表中沒有行,則不會返回1。 COUNT(ProjectId)將低於COUNT(*)只有在表中有一個或多個行,ProjectId列是NULL在一個或多個這些行中。

+0

如果我用'uc.Count()'替換'g.Count()',我得到錯誤'名稱'uc'在當前上下文中不存在'。如果我不清楚,也是我的道歉,你說ProjectId是NULL是正確的。 – SneakAttaack