在使用 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()
导致生成以下 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 检查有什么问题?