作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我不擅长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/
我是一名优秀的程序员,十分优秀!