c# - Linq 对字符串值进行左连接,从 Oracle 数据库中获取不正确的数据
问题描述
在使用 Linq2Db 作为映射层时,在 Oracle DB 上使用左连接会导致返回一些有趣的数据问题。
SELECT * FROM REBATE_HISTORY frh
LEFT JOIN PAYMENT fp
ON frh.TRANSACTION_REFERENCE_NUMBER = fp.TRANSACTION_REFERENCE_NUMBER
由于 3 年没有相关的付款,对特定的回扣年份条目运行此选择会从数据库表中返回 8 个条目。但是下面的 linq 语句:
from rebateHistory in database.RebateHistory
join payments in database.Payments
on rebateHistory.ReferenceNumber equals payments.ReferenceNumber into paymentHistory
from payment in paymentHistory.DefaultIfEmpty()
导致生成以下 SQL 查询,该查询又返回 3000 多个条目
FROM REBATE_HISTORY rebateHistory
LEFT JOIN PAYMENT paymentHistory
ON (rebateHistory.TRANSACTION_REFERENCE_NUMBER IS NULL AND paymentHistory.TRANSACTION_REFERENCE_NUMBER IS NULL
OR rebateHistory.TRANSACTION_REFERENCE_NUMBER = paymentHistory.TRANSACTION_REFERENCE_NUMBER )
生成的 SQL 包含对两个列值的 IS NULL 检查出了什么问题?
解决方案
正如svyatoslav-danyliv所指出的, Linq2Db的配置默认使用 CompareNullsAsValues,这会导致生成的 SQL 包含对两个字段的空检查。
修复是在 DataConnection 对象的构造函数中定义:
Linq2Db.Common.Configuration.Linq.CompareNullsAsValues = false
推荐阅读
- c# - 通过 Azure Web 应用程序连接到 Google Sheets
- ibm-midrange - 如何使用 DB2 获取 IBM i (AS/400) 系统中所有库中的对象计数
- snakemake - 如何用相对路径指定snakemake包装器?
- python - 使用python根据日期条件删除行
- .net - .NET 中可用的序列化程序
- c++ - 如何用前导零和四舍五入的小数格式化双精度
- c# - 操作返回无效状态代码“禁止”-PowerBi 应用拥有数据
- hyperledger-fabric - InMemoryWallet 中的 Hyperledger Fabric 导入身份
- java - RMI 将对象绑定到注册表并从客户端访问
- c# - 为什么在尝试获取 log4net 日志记录级别时会出现“对象引用”错误?