当执行以下 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/