我有以下LINQ语句:
var inspectorAllocSummary = context
.UserDetails
.Where(ud => ud.PerformAudit == true && ud.Valid == true)
.OrderBy(ud => ud.Firstname)
.Select(ud
=> new InspectorWorkStatusModel
{
InspectorName = ud.Firstname,
ToBeCompleted = context
.InspectorWorkAllocations
.Where(x => x.UploadCOESDetails.AuditMonth
== criteria.AuditMonth
&& x.InspectorId == ud.Id)
.Sum(x=> x.ToBeAudited) ?? 0,
Completed = context
.COESDetails
.Where(x => x.UploadCOESDetails.AuditMonth
== criteria.AuditMonth
&& x.InspectorId == ud.Id
&& x.AuditType != null)
.Count()
});
ToBeCompleted
是一个整数,它从数据库中获取数据,但如果它是null,我想确保它设置为0
。我尝试了以下方法:
ToBeCompleted = context
.InspectorWorkAllocations
.Where(x => x.UploadCOESDetails.AuditMonth == criteria.AuditMonth
&& x.InspectorId == ud.Id)
.Sum(x=> x.ToBeAudited) ?? 0
但是我收到以下错误:
运营商'??'不能应用于'int'和'int'
类型的操作数
如果返回数据为null
,我如何确保将其设置为零?
答案 0 :(得分:1)
如果ToBeAudited
是int
,那么Sum
永远不会返回null
,它始终返回int
。如果集合为空,则返回0.只需取消?? 0
。
但是,如果生成的SQL不返回任何记录,则Linq-to-SQL和Linq-to-Entities 可以抛出错误。对于Linq-to-SQL,一个“修复”是将底层字段转换为可空类型:
.Sum(x=> (int?)x.ToBeAudited) ?? 0
对于Linq-to-Entities,修复方法是调用.DefaultIfEmpty()
:
.Select(x=> x.ToBeAudited)
.DefaultIfEmpty(0)
.Sum()
答案 1 :(得分:1)
首先,您需要将ToBeAudited
的类型更改为int?
。问题来自于int
是value type并且不能包含null
这一事实。这就是为什么在第一种方法中你会得到错误:
转换为值类型'Int32'失败,因为具体化值为null。
有一个Sum
重载,它接受可以为空的值。因此,在将ToBeAudited
变为可空之后,这就足够了:
ToBeCompleted = context
.InspectorWorkAllocations
.Where(x => x.UploadCOESDetails.AuditMonth == criteria.AuditMonth
&& x.InspectorId == ud.Id)
.Sum(x => x.ToBeAudited).Value;
您不需要??
运算符,因为null
值会被自动忽略(对于空序列Sum
将返回0
)。