2009-04-22 83 views
2

当执行下面的LINQ to SQL语句:为什么我用这个Linq to Sql方法得到InvalidOperationException?

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(空值不能被分配到的Int32)。

通过调试我已经看到这是来自动态对象的Rating属性。

如果特定链接没有SqlLinkVotes,则Sum()结果为空值,但Rating是int,而linq to sql认为Sum()将导致int,而不是可为null的int。

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

请帮忙!

回答

6

有一个Connect thread about this这表明您将Sum()的结果转换为可为空的类型(在您的情况下为int?)。我想,如果你想要的评级是非空的,然后你可以使用空合并运算符:

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

这是值得一试,反正。

+0

啊哈!你击败了我!我刚刚发布了同样的东西。 – 2009-04-22 09:05:23

+0

这个答案有效 - 几个星期前被这个问题咬了,发现了这个问题。 – 2009-04-22 09:07:38

0

看起来像简单地将Rating字段转换为可为null的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() 
            };