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

时间:2009-04-22 08:55:43

标签: 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()
                           };

我收到System.InvalidOperationException(无法将null值分配给Int32)。

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

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

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

请帮忙!

2 个答案:

答案 0 :(得分:6)

Connect thread about this表示您将Sum()的结果转换为可以为空的类型(int?)。我怀疑如果您希望评级不可为空,那么您可以使用null-coalescing运算符:

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

无论如何,值得一试。

答案 1 :(得分:0)

看起来只是简单地将Rating字段转换为可以为空的int修复它。

这对其他人来说是否合理?

var stuff = from l in _db.SqlLinks
                        select new
                                   {
                                       Link = l,
                                       Rating = (int?)(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()
                                   };