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,//外表字段