Count of Sum抛出异常,但SelectMany()。Count()不抛出

时间:2013-11-05 16:17:51

标签: c# linq

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

为什么此代码会抛出异常:

  

转换为值类型'System.Int32'失败,因为已实现   value为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
                        })

2 个答案:

答案 0 :(得分:4)

您的SumCount()投掷的是空。

允许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
    })

答案 1 :(得分:1)

这是因为Members属性可以为null。您应该添加一个检查,如果它为空,那么您的第一种方法将正常工作。

例如:

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