Linq 对从 Oracle 数据库中获取错误数据的字符串值进行左连接

在使用 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 检查有什么问题?

tns1986 回答:Linq 对从 Oracle 数据库中获取错误数据的字符串值进行左连接

正如 svyatoslav-danyliv 所指出的,Linq2Db 的配置默认使用 CompareNullsAsValues,这会导致生成的 SQL 在两个字段上都包含空检查。

修复是在你的 DataConnection 对象的构造函数中定义:

Linq2Db.Common.Configuration.Linq.CompareNullsAsValues = false

本文链接:https://www.f2er.com/776063.html

大家都在问