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

为什么这段代码会抛出异常:

转换为值类型“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

你的SumorCount()正在抛出一个空值。

允许Posts在您的Statistic类中为可空并将值转换为可空整数。

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

或使用 获取值.Value。如果计数总和仍为空值,该.Value方法仍将引发异常。

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

这是因为Members属性可以为空。您应该添加一个检查它是否为空,然后您的第一种方法可以正常工作。

例如:

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