Linq语句异常:Nullable object must have value

 var strQuery = (new int[] { 1 }).Select(x => new
                {
                    MailGroupId = "empty",
                    ResId = "empty",
                    AlarmMaxCount =0,
                    AlarmMaxTime = 0,
                    SmsFlag = "empty",
                    MailFlag = "empty",
                    InhibitFlag = "empty",
                    MissingDataFlag = "empty",
                    EqpControlFlag = "empty",
                }).ToList();

 

 strQuery = ctx.Fdcmailgroup.GroupJoin(
                       ctx.Fdcresmailgrouprel.Where(t => t.Factory == sFactory && t.ResId == sResId && t.MailGroupId.CompareTo(sMailGroupId) >= 0),//&& 
                       a => new { f = a.Factory, id = a.MailGroupId },//主表外键,对应SQL语句“WHERE A.FACTORY=B.FACTORY AND A.BOMSETID=B.BOMSETID”
                       b => new { f = b.Factory, id = b.MailGroupId },//外键表主键
                       (a, b) => new { AA = a, BB = b })
                   .SelectMany(
                       ab => ab.BB.DefaultIfEmpty(),//Left Join
                       (a, b) => new 
                       {
                           a.AA.MailGroupId,
                           b.ResId,
                           AlarmMaxCount =b.AlarmMaxCount,
                           AlarmMaxTime=b.AlarmMaxTime ,//外表字段
                           b.SmsFlag,//外表字段
                           b.MailFlag,//外表字段
                           b.InhibitFlag,//外表字段
                           b.MissingDataFlag,//外表字段
                           b.EqpControlFlag,//外表字段
                       }).Distinct().OrderByDescending(t => t.MailGroupId).ToList();//
//});

如上Linq查询示例,异常原因:两表进行左连接时,以左表为基表,右表为外表,当右表有数据满足查询条件时则跟左表关联,不满足时将以左表字段为主,右表字段值为空,这样一来,尽管数据库里数值类型的字段设置了默认值为0,还是会因为左连查询而被置空。

所以在查询时就有了空值被赋给数值类型字段,即导致Nullable object must have value 该错误的发生。

解决方法:

将数值类型查询的结果用三元运算符进行判断后获取:

 AlarmMaxCount =b.AlarmMaxCount>0? b.AlarmMaxCount : 0,//外表字段
 AlarmMaxTime=b.AlarmMaxTime > 0 ? b.AlarmMaxTime : 0,//外表字段

 

转载于:https://my.oschina.net/8824/blog/3094274

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值