场景如下:
使用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() 报出来的
b.ProductId
是不可空的,但 a.ProductId
是可空的,问题应该出在 a.ProductId
,改为下面的试试
join b in provistisql on a.ProductId ?? 0 equals b.ProductId into pvj
dudu 大神,我试了一下,还是会报错相同的错误,我查过数据,a 里边的ProductId 虽然是 long?,但是都是有值的
@死神的背影: 试试把 b.ProductId
改为可空类型 int ?
,或者把 a.ProductId
改为不可空类型
@dudu: 我也想到了尝试把 a的 ProductId 改成 long,非空的,DB里边也改成非null了, 但是 查询还是报相同的错误
@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 的位置是有什么影响?