1

私は正常に動作する次のSQLを持っています

SELECT 
    f.ForumId, 
    f.Name, 
    COUNT(ft.TopicId) AS TotalTopics, 
    COUNT(fm.MessageId) AS TotalMessages
FROM 
    tblForumMessages fm INNER JOIN
    tblForumTopics ft ON fm.TopicId = ft.TopicId RIGHT OUTER JOIN
    tblForums f ON ft.ForumId = f.ForumId
GROUP BY f.ForumId, f.Name

私はLinqに変換しようとしています。

これが私が持っているものです

 var forums =   (from f in Forums
                join ft in ForumTopics on f.ForumId equals ft.ForumId into topics
                from y in topics.DefaultIfEmpty()
                join fm in ForumMessages on y.TopicId equals fm.TopicId into messages
                from x in messages.DefaultIfEmpty()
                select new { f.ForumId, f.Name, y.TopicId, x.MessageId } into x
                group x by new { x.ForumId, x.Name } into g
                select new
                    {
                        ForumId = g.Key.ForumId,
                        ForumName = g.Key.Name,
                        TopicCount = g.Count(i => i.TopicId),
                        MessageCount = g.Count(i => i.MessageId)
                    }
                ).ToList();

TopicCount = g.Count(i => i.TopicId)「式の型 'System.Guid' を戻り型 'bool' に変換できません」というエラーが表示されます。

この作業を行うために何が欠けていますか?

ありがとう

*編集*

Rob のおかげで動作するようになりましたが、レコードがなくても、Topic Count と Message Count のカウントは常に 1 を返していました。どちらも 0 を返すはずでした。

変更してクエリを変更しました

select new { f.ForumId, f.Name, y.TopicId, x.MessageId } into x

select new
{
    f.ForumId, f.Name, 
    TopicId = y != null ? y.TopicId : (Guid?)null,
    MessageId = z != null ? z.MessageId : (Guid?)null
} into x

実際のカウントについては、クエリを次のように変更しました

select new
{
    g.Key.ForumId,
    g.Key.Name,
    TopicCount = g.Count(t => t.TopicId != null),
    MessageCount = g.Count(t => t.MessageId != null)
} 
4

2 に答える 2

2

問題のある記事はTopicCount = g.Count(i => i.TopicId). このCountメソッドはFunc<T, bool>(述語を満たすコレクション内のアイテムの数を与えます) を取ります。

TopicIdグループ内の個別の の数が必要なようです。に置き換えTopicCount = g.Count(i => i.TopicId)てみてくださいTopicCount = g.GroupBy(i => i.TopicId).Count()

于 2013-11-01T19:55:03.097 に答える
0

あなたも試すことができますTopicCount = g.Select(i => i.TopicId).Distinct().Count()

于 2013-11-01T20:15:07.877 に答える