2011-09-16 8 views
1

カウント:Count()が生成するSQLは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() 
} 

トラブルインクルードが行ではないときには1を返すような結果をめちゃくちゃさCOUNT(*)、されています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(*)を実行していたため、プロジェクトIDがnullの場合はnullが返されます(Jayの言葉通り)。これはカウント数が1になり、結果が不正になることがあります。

以下に選択のカウント一部を変更すると、うまく動作します:あなたの返信用

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

おかげ

0

私はもちろん、間違われる可能性があり、それはあなたのLINQクエリのCOUNT(*)ではなくUserCategory上よりも、グループ化で動作しているように私には見えます。

g.Count()uc.Count()に置き換えた場合はどうなりますか?

COUNT(*)は、テーブルに行がない場合は1を返しません。 COUNT(ProjectId)は、テーブルに1つ以上の行があり、その1つ以上の行にProjectId列がNULLである場合にのみ、COUNT(*)より低くなります。

+0

'g.Count()'を 'uc.Count()'に置き換えると、 '名前' uc 'が現在のコンテキストに存在しません'というエラーが表示されます。また、もし私が明確ではない場合は、ProjectIdがNULLであると言ってもいいです。 – SneakAttaack

関連する問題