如何纠正以下linq?

时间:2013-11-02 15:14:44

标签: c# .net linq

我有以下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,我如何确保将其设置为零?

2 个答案:

答案 0 :(得分:1)

如果ToBeAuditedint,那么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?。问题来自于intvalue 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)。