oracle where 右边表达式为null 读取不到数据,看sql 日志没转成is nul 而是=null 返回

C#论坛 老数据
4 1858

问题:oracle where  右边表达式为null 读取不到数据,看sql 日志没转成is null  而是=null

比较常见的操作时先读取主表,然后再其他表根据主表的字段过滤查询,如下常见操作例子:

 var buinessList = db_flow.Queryable<ZCT_WFE_BUSINESS>().Where(c => c.BUSSINESSCODE == businessCode).ToList();
  business = buinessList.FirstOrDefault();
  int? regoinId =null;
  businessFlow = db_flow.Queryable<ZCT_WFE_BUSINESSFLOW>().Where(c => c.BUSINESSID == business.BUSINESSID && c.REGOIDID == regoinId).First();

    

business.BUSINESSID 表ZCT_WFE_BUSINESS的主键肯定是有值的 ,REGOIDID字段是允许为空的,这时刚好传参regoinId 为null,看sql 日志没转成is null  而是
REGOIDID=:REGOIDID,这样赋值肯定不对的 应该是 REGOIDID is  null

如果以下写法又是可以的 REGOIDID is  null
 businessFlow = db_flow.Queryable<ZCT_WFE_BUSINESSFLOW>().Where(c => c.BUSINESSID == business.BUSINESSID && c.REGOIDID == (int?)null).First();

源码修复(考虑可能不周 ,请作者修复借鉴):

热忱回答4

  • db.Queryable<Order>()

                    .WhereIF(xx==null,it.id == null)

                    .WhereIF(xx != null, it.id == id)

                    .ToList();

    你先这样用,具体是否修改我在评估一下

    0 回复
  • @fate stay night: http://www.donet5.com/Home/Doc?typeId=1213 经过我考虑决定添加一个sqlfunc函数实现你的需求,后面版本会发布

    0 回复
  • @fate stay night:能否内部直接判断下做个转换 ,不要再额外调用sqlfunc 这样要判断多少个地方,都不敢保证数据一定不是null的

    0 回复
  • @风之圣痕:正常逻辑是 whereif(xx!=null, it=>it.xx==xx)

    像你这种要等于NULL的逻辑很少

    0 回复