Linq 左连接字符串值从 Oracle 数据库中获取不正确的数据

Linq left join on string values fetching incorrect data from Oracle database

在 Oracle 数据库上使用左联接会导致在使用 Linq2Db 作为映射层时返回一些有趣的数据问题。

SELECT * FROM REBATE_HISTORY frh 
LEFT JOIN PAYMENT fp 
    ON frh.TRANSACTION_REFERENCE_NUMBER = fp.TRANSACTION_REFERENCE_NUMBER

运行 此 select 针对特定回扣年份条目 returns 来自数据库的 8 个条目 table,因为 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 查询,进而 returns 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