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
在 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