执行以下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。
请帮忙!
答案 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()
};