【发布时间】:2016-01-08 12:16:47
【问题描述】:
我不擅长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 性能。有什么建议吗?
【问题讨论】:
-
q.billNum和d.billNum的类型是什么? -
两种数据类型相同,字符串类型
-
您的列可以为空吗?也许
q.billNum equals d.billNum中的等号假设您也希望NULL == NULL匹配? -
是的,该列可以为空。
-
可能你没有按要求配置它们。你真的需要它们可以为空吗?因为这就是 EF 附加您所要求的标准的原因。