gpt4 book ai didi

c# - LINQ to SQL join 生成在 IS NULL 上加入的 SQL

转载 作者:太空狗 更新时间:2023-10-29 18:26:38 27 4
gpt4 key购买 nike

我不擅长Linq表达式,今天我遇到了一个奇怪的问题,如下面的inner join语句,

var orders = (from q in dao.CurrentDBContext.New_OrderForm 
join d in dao.CurrentDBContext.New_OrderGoodsDetail on q.billNum equals d.billNum
select new
{
q.billNum,
q.orderSource,
q.sourceOddNum
d.PPT
}

虽然我跟踪了 linq 语句,但我很困惑 Entity Framework 会将 linq 语句转换为下面的 sql 语句

SELECT 
[Extent1].[billNum] AS [billNum],
[Extent1].[orderSource] AS [orderSource],
[Extent1].[sourceOddNum] AS [sourceOddNum],
[Extent2].[PPT] AS [PPT]
FROM [dbo].[New_OrderForm] AS [Extent1]
INNER JOIN [dbo].[New_OrderGoodsDetail] AS [Extent2]
ON ([Extent1].[billNum] = [Extent2].[billNum]) OR
(([Extent1].[billNum] IS NULL) AND ([Extent2].[billNum] IS NULL))

你知道为什么下面的 SQL 段会自动追加吗?

OR (([Extent1].[billNum] IS NULL) AND ([Extent2].[billNum] IS NULL)

我不希望上面的代码自动追加,因为它确实降低了 SQL 性能。有什么建议吗?

最佳答案

如果您无法将 billNum 列更改为不可空的,您可以执行以下操作。

首先,设置@Giorgi提到的选项

class CurrentDBContext
{
public CurrentDBContext()
{
Configuration.UseDatabaseNullSemantics = true;
// ...
}
}

然后将 LINQ 查询更改为不使用 join,而是像这样简单的where

var orders = (from q in dao.CurrentDBContext.New_OrderForm 
from d in dao.CurrentDBContext.New_OrderGoodsDetail
where q.billNum == d.billNum
select ...

结果将与您显示的 SQL 查询完全相同(with JOIN!)没有 OR 部分。

关于c# - LINQ to SQL join 生成在 IS NULL 上加入的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34676961/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com