首页 > 解决方案 > 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 检查出了什么问题?

标签: c#oraclelinqlinq2db

解决方案


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

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

Linq2Db.Common.Configuration.Linq.CompareNullsAsValues = false


推荐阅读