首页 新闻 会员 周边 捐助

.net ef 查询 报 Nullable 的问题

0
悬赏园豆:10 [已解决问题] 解决于 2018-07-30 09:47

场景如下:

使用net core 2.1 的ef 做查询

var sqlquery = (from a in sql
                join b in provistisql on a.ProductId equals b.ProductId into pvj
                from pvjd in pvj.DefaultIfEmpty()
      join pbbi in brokeragesql on a.ProductId equals pbbi.ProductId into pbbij
                from pbbid in pbbij.DefaultIfEmpty()
                 select new ProductsDistributionModel()
                 {
                    Id = a.ProductId.HasValue? a.ProductId.Value : 0
                     //省略一堆查询字段
                 });

出现的问题是,只要 左联 provistisql 这个查询表达式,sqlquery 一统计count() 就报错

"Nullable object must have a value", 但是把 join b ... from pvjd ...两行一注释掉,就正常了, provistisql 表达式如下

var provistisql = Context.ProductVistiInfo.GroupBy(d => d.ProductId).Select(d => new
            {
                ProductId = d.Key,
                SaleAmount = d.Sum(t => t.SaleAmounts),
                SaleNum = d.Sum(t => t.SaleCounts)
            });

看了半天,也不存在字段取值 为null的情况, 其中 Context.ProductVistiInfo 的 ProductId 字段是不可空的,对应的 amount 和 num 也是 非空的。

sqlquery 只是加了个 left join provistisql 的联查 就会报 nullable 的错,不加 left join provistisql 就不报错,
可能是什么原因?(PS:第二个left join brokeragesql 就没有问题,不会报错)
报错抛出的地方是 紧接着统计 sqlquery.count() 报出来的

 

死神的背影的主页 死神的背影 | 小虾三级 | 园豆:667
提问于:2018-07-26 20:58
< >
分享
最佳答案
0

b.ProductId 是不可空的,但 a.ProductId 是可空的,问题应该出在 a.ProductId ,改为下面的试试

join b in provistisql on a.ProductId ?? 0 equals b.ProductId into pvj
收获园豆:10
dudu | 高人七级 |园豆:30948 | 2018-07-26 22:02

dudu 大神,我试了一下,还是会报错相同的错误,我查过数据,a 里边的ProductId 虽然是 long?,但是都是有值的

死神的背影 | 园豆:667 (小虾三级) | 2018-07-27 09:39

@死神的背影: 试试把 b.ProductId 改为可空类型 int ?,或者把 a.ProductId 改为不可空类型

dudu | 园豆:30948 (高人七级) | 2018-07-27 10:04

@dudu:  我也想到了尝试把 a的 ProductId 改成 long,非空的,DB里边也改成非null了, 但是 查询还是报相同的错误

死神的背影 | 园豆:667 (小虾三级) | 2018-07-27 10:19

@dudu: 神奇的事情

我把join b ... from pvjd ...两行 left join 放到了 join pbbi from pbbid 的后边就好了,代码如下

var sqlquery = (
from a in sql
join pbbi in brokeragesql on a.ProductId equals pbbi.ProductId into pbbij
from pbbid in pbbij.DefaultIfEmpty()
join b in provistisql on a.ProductId equals b.ProductId into pvj
from pvjd in pvj.DefaultIfEmpty()
               select new ProductsDistributionModel()
               {
                Id = a.ProductId,
                SaleAmount = (pvjd == null ? 0 : pvjd.SaleAmount),
                SaleNum = (pvjd == null ? 0 : pvjd.SaleNum)
             });

 

只是统计SaleAmount 的时候报了个  MySqlException: Unknown column 't.SaleAmount' in 'field list' ,但如果注释掉 pvjd 的两个查询列, 就正常不报错了,所以 这个left join 的位置是有什么影响?

 

死神的背影 | 园豆:667 (小虾三级) | 2018-07-27 10:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册