Mat*_*one 2 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()
};
Run Code Online (Sandbox Code Playgroud)
我得到一个System.InvalidOperationException(无法将null值赋给Int32).
通过调试我发现它来自动态对象的Rating属性.
当没有特定链接的SqlLinkVotes时,Sum()会产生一个空值,但是Rating是一个int,而linq到sql认为Sum()会产生一个int,而不是一个可以为null的int.
我可以轻松编写一个存储过程来解决这个问题,但我认为这是一个很好的方式让我更了解linq到sql.
请帮忙!
有关于此的Connect线程,这表明您将结果Sum()转换为可空类型(int?在您的情况下).我怀疑如果您希望评级为非可空,则可以使用null-coalescing运算符:
Rating = ((int?) (from v in l.SqlLinkVotes
where v.Tag == tagId
&& v.VoteDate >=
select v.Vote).Sum()) ?? 0
Run Code Online (Sandbox Code Playgroud)
无论如何,这值得一试.