问题描述
在使用 Linq2Db 作为映射层时,在 Oracle DB 上使用左联接会导致返回一些有趣的数据问题。
SELECT * FROM REBATE_HISTORY frh
LEFT JOIN PAYMENT fp
ON frh.TRANSACTION_REFERENCE_NUMBER = fp.TRANSACTION_REFERENCE_NUMBER
针对特定的回扣年份条目运行此选择会从数据库表中返回 8 个条目,因为 3 年没有相关的付款。但是以下 linq 语句:
from rebateHistory in database.RebateHistory
join payments in database.Payments
on rebateHistory.ReferenceNumber equals payments.ReferenceNumber into paymentHistory
from payment in paymentHistory.DefaultIfEmpty()
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