0
db.Projects.Select(x => new Statistic {
                          Posts = x.Members.Sum(m => m.Posts.Count())
                        })

このコードが例外をスローする理由:

具体化された値が null であるため、値型 'System.Int32' へのキャストが失敗しました。結果の型のジェネリック パラメーターまたはクエリのいずれかで、null 許容型を使用する必要があります。

そして、このコードは正常に動作します

db.Projects.Select(x => new Statistic {
                           Posts = x.Members.SelectMany(m => m.Posts).Count()
                        })

?

構造は直感的です。

プロジェクトには多くのメンバーがいます。
メンバーには多くの投稿があります。

public virtual ICollection<Post> Posts { get; set; }

編集:最終的な作業コード

db.Projects.Select(x => new Statistic {
                          Posts = (int?)x.Members.Sum(m => m.Posts.Count()) ?? 0
                        })
4

2 に答える 2

4

あなたのSumまたはCount()がnullを投げています。

クラスPostsStatisticで null を許容し、値を null 許容の int にキャストできるようにします。

db.Projects
    .Select(x => new Statistic
    {
        Posts = (int?)x.Members.Sum(m => (int?)m.Posts.Count())
    })

または で値を取得します.Value.Valueカウントの合計が null 値になる場合でも、このアプローチは例外をスローします。

db.Projects
    .Select(x => new Statistic
    {
        Posts = x.Members.Sum(m => (int?)m.Posts.Count()).Value
    })
于 2013-11-05T16:20:04.150 に答える
1

これは、Membersプロパティが null になる可能性があるためです。null の場合はチェックを追加する必要があり、最初のアプローチは正常に機能します。

例えば:

db.Projects.Select(x => new Statistic {
    Posts = x.Members==null? 0 :  x.Members.Sum(m => m.Posts.Count())
})
于 2013-11-05T16:20:21.947 に答える