gpt4 book ai didi

c# - Entity Framework LINQ to Entities 加入查询超时

转载 作者:行者123 更新时间:2023-12-03 19:34:50 24 4
gpt4 key购买 nike

我正在执行以下 LINQ to Entities 查询,但它被卡住并且直到超时才返回响应。我在 SQL Server 上执行了相同的查询,它在 3 秒内返回 92000。

            var query = (from r in WinCtx.PartsRoutings
join s in WinCtx.Tab_Processes on r.ProcessName equals s.ProcessName
join p in WinCtx.Tab_Parts on r.CustPartNum equals p.CustPartNum
select new { r}).ToList();

生成的 SQL:

SELECT [ I omitted columns]
FROM [dbo].[PartsRouting] AS [Extent1]
INNER JOIN [dbo].[Tab_Processes] AS [Extent2] ON ([Extent1].[ProcessName] = [Extent2].[ProcessName]) OR (([Extent1].[ProcessName] IS NULL) AND ([Extent2].[ProcessName] IS NULL))
INNER JOIN [dbo].[Tab_Parts] AS [Extent3] ON ([Extent1].[CustPartNum] = [Extent3].[CustPartNum]) OR (([Extent1].[CustPartNum] IS NULL) AND ([Extent3].[CustPartNum] IS NULL))

PartsRou​​ting 表有 100,000 多条记录,零件 = 15000+,进程 = 200。

我尝试了太多网上找到的东西,但对于如何以相同的 SQL 性能实现结果,没有任何效果。

最佳答案

根据评论,问题似乎是由 EF SQL 翻译器生成的联接中的附加 ORIS NULL 条件引起的。它们被添加到 EF 中是为了模拟 C# == 运算符语义,该语义与 SQL =NULL 值不同。

您可以首先通过 UseDatabaseNullSemantics 关闭 EF 行为属性(默认为 false):

WinCtx.Configuration.UseDatabaseNullSemantics = true;

不幸的是,这还不够,因为它修复了正常的比较运算符,但他们只是忘记对连接条件执行相同的操作。

如果您仅使用联接进行过滤(看起来如此),您可以将它们替换为 LINQ Any 条件,这些条件可转换为 SQL EXISTS 和当今的数据库查询优化器以与内部联接相同的方式对待它:

var query = (from r in WinCtx.PartsRoutings
where WinCtx.Tab_Processes.Any(s => r.ProcessName == s.ProcessName)
where WinCtx.Tab_Parts.Any(p => r.CustPartNum == p.CustPartNum)
select new { r }).ToList();

您也可以考虑仅使用 select r,因为使用单个属性创建匿名类型只会引入额外的内存开销,而且没有任何优势。

更新:查看最新评论,您确实需要连接表中的字段(这就是为什么不要省略相关查询的相关部分很重要)。在这种情况下,您可以尝试使用 where 子句的替代连接语法:

WinCtx.Configuration.UseDatabaseNullSemantics = true;
var query = (from r in WinCtx.PartsRoutings
from s in WinCtx.Tab_Processes where r.ProcessName == s.ProcessName
from p in WinCtx.Tab_Parts where r.CustPartNum == p.CustPartNum
select new { r, s.Foo, p.Bar }).ToList();

关于c# - Entity Framework LINQ to Entities 加入查询超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42973300/

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