连表查询 group by 出现异常Nullable object must have a value

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

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

解决方案:

方式一:针对左表分组的匿名对象new一个具体的对象并将值类型的字段设置为可空

出错语句:

复制代码
           var queryC = from d in queryD
                         group d by d.PicId into g
                         select new 
                         {
                             PicId= g.Key,
                             Count = g.Count()
                         };


            var query = from r in queryR
                        join c in queryC on r.FId equals c.PicId into g
                        from cg in g.DefaultIfEmpty()
                        join s in _repository.GetAll() on r.FId equals s.PicId into k
                        from sk in k.DefaultIfEmpty()
                        select new RecordDto()
                        {
                            Type = r.Type,
                            Name = r.Name,
                            FId = r.FId,
                            Id = r.Id,
                            Status = sk != null ? sk.Status : false,
                            Type = cg != null ? TypeEnum.多 : TypeEnum.单
                        };
复制代码

增加对象ResultGroup,并将值类型的Count设置为可空

修改后linq语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var queryC = from d in queryD
               group d by d.PicId into g
               select new ResultGroup()
               {
                   PicId= g.Key,
                   Count = g.Count()
               };
 
 
  var query = from r in queryR
              join c in queryC on r.FId equals c.PicId into g
              from cg in g.DefaultIfEmpty()
              join s in _repository.GetAll() on r.FId equals s.PicId into k
              from sk in k.DefaultIfEmpty()
              select new RecordDto()
              {
                  Type = r.Type,
                  Name = r.Name,
                  FId = r.FId,
                  Id = r.Id,
                  Status = sk != null ? sk.Status : false,
                  Type = cg != null ? TypeEnum.多 : TypeEnum.单,
                  Count = cg.Count > 0? cg.Count : 0
              };

方式二:直接判断值类型的结果后赋值

复制代码
            var queryC = from d in queryD
                         group d by d.PicId into g
                         select new 
                         {
                             PicId= g.Key,
                             Count = g.Count()
                         };


            var query = from r in queryR
                        join c in queryC on r.FId equals c.PicId into g
                        from cg in g.DefaultIfEmpty()
                        join s in _repository.GetAll() on r.FId equals s.PicId into k
                        from sk in k.DefaultIfEmpty()
                        select new RecordDto()
                        {
                            Type = r.Type,
                            Name = r.Name,
                            FId = r.FId,
                            Id = r.Id,
                            Status = sk != null ? sk.Status : false,
                            Type = cg.Count > 0 ? TypeEnum.多 : TypeEnum.单,
Count = cg.Count > 0 ?
cg.Count : 0
                         };
复制代码

 

posted @   流年sugar  阅读(472)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示