c# - 为什么使用此 Linq to Sql 方法会出现 InvalidOperationException?

标签 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(无法将空值分配给 Int32)。

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

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

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

请帮忙!

最佳答案

有一个 Connect thread about this这表明您将 Sum() 的结果转换为可为 null 的类型(在您的情况下为 int?)。我怀疑如果您希望评分不可为空,则可以使用空合并运算符:

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

无论如何都值得一试。

关于c# - 为什么使用此 Linq to Sql 方法会出现 InvalidOperationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/776269/

相关文章:

sql - 如何匹配主键长度不同的两个表

asp.net - 查询LINQ to SQL关系

c# - Task.WhenAll 为 Task<ConcurrentDictionary> 创建副本

c# - 将 Razor 选择绑定(bind)到来自 VewData 的字典

c# - 是否只有在条件为真时才从函数返回的单行语句?

mysql - 为什么将文本附加到字段中并全部替换为 0

sql - 当您希望 NULL = NULL 为真时,在 SQL 中该怎么做?

c# - 如何让 ReadJson 返回 "default"行为——就好像 CanConvert 返回 false

c# - 我的 GroupBy 查询有什么问题

c# - 具有 linq 查询和存储表达式错误的 Entity Framework