为什么我使用这个Linq to Sql方法获得InvalidOperationException?

Mat*_*one 2 c# sql linq linq-to-sql

执行以下linq to sql语句时:

    var stuff = from l in _db.SqlLinks
                select new
                           {
                               Link = l,
                               Rating = (from v in l.SqlLinkVotes
                                         where v.Tag == tagId
                                               && v.VoteDate >= since
                                         select v.Vote).Sum(),
                               NumberOfVotes = (from v in l.SqlLinkVotes
                                                where v.Tag == tagId
                                                      && v.VoteDate >= since
                                                select v.Vote).Count(),
                               NumberOfComments = (from v in l.SqlLinkVotes
                                                   where v.Tag == tagId
                                                         && v.VoteDate >= since
                                                         && v.Comment != ""
                                                   select v.Vote).Count()
                           };
Run Code Online (Sandbox Code Playgroud)

我得到一个System.InvalidOperationException(无法将null值赋给Int32).

通过调试我发现它来自动态对象的Rating属性.

当没有特定链接的SqlLinkVotes时,Sum()会产生一个空值,但是Rating是一个int,而linq到sql认​​为Sum()会产生一个int,而不是一个可以为null的int.

我可以轻松编写一个存储过程来解决这个问题,但我认为这是一个很好的方式让我更了解linq到sql.

请帮忙!

Jon*_*eet 6

有关于此Connect线程,这表明您将结果Sum()转换为可空类型(int?在您的情况下).我怀疑如果您希望评级为非可空,则可以使用null-coalescing运算符:

Rating = ((int?) (from v in l.SqlLinkVotes
                  where v.Tag == tagId
                     && v.VoteDate >= 
                  select v.Vote).Sum()) ?? 0
Run Code Online (Sandbox Code Playgroud)

无论如何,这值得一试.