LINQ to SQL查询报错:nullable object must have a value,无分类预算如何设Sum返回0?
解决LINQ to SQL中Sum空集合报错的问题
嗨,刚接触LINQ to SQL遇到这种问题太正常啦~你的问题核心在于:当rec.categories是空集合(没有任何分类记录)时,SQL的SUM()函数会返回NULL,而如果你的totalSpent对应的数据类型是非可空的数值类型(比如decimal),就会因为无法将NULL转换为非可空类型而抛出错误。
要让Sum在无分类时返回0,只需要稍微调整一下Sum的写法,利用可空类型和空合并运算符??来处理:
var r = from rec in DbContext.budgets where rec.budgetID == updatedBudget.budgetID select new { rec.budgetID, rec.totalIncome, totalSpent = rec.categories.Sum(a => (decimal?)a.amount) ?? 0 }; return new JsonResult(r.FirstOrDefault(), JsonSettings);
为什么这样能解决问题?
- 首先,我们把
a.amount强制转换为可空的数值类型(比如decimal?),这样LINQ to SQL生成的SQL语句中,SUM()返回的NULL会被映射为C#中的null(而不是直接抛出转换错误)。 - 然后用
?? 0来判断:如果Sum的结果是null(也就是没有分类记录),就用0来替代,完美规避了空值转换的问题。
另外补充个小知识点:在LINQ to Objects里,空集合的Sum会直接返回0,但LINQ to SQL是直接映射到数据库的SUM函数,数据库的SUM对空结果集就是返回NULL,这也是新手容易踩的坑哦~
内容的提问来源于stack exchange,提问作者Chris Westbrook
相关产品推荐
相关产品推荐

