gpt4 book ai didi

linq - 优化 Entity Framework 中的 LINQ Any() 调用

转载 作者:行者123 更新时间:2023-12-04 08:53:30 25 4
gpt4 key购买 nike

在分析基于 Entity Framework 4.0 的数据库层后,我发现主要的性能罪魁祸首是一个简单的 LINQ Any(),我用来检查实体是否已存在于数据库中。 Any() 检查的执行速度比保存实体慢几个数量级。
数据库中的行相对较少,并且正在检查的列已编入索引。

我使用以下 LINQ 来检查设置组是否存在:

from sg in context.SettingGroups
where sg.Group.Equals(settingGroup) && sg.Category.Equals(settingCategory)
select sg).Any()

这会生成以下 SQL(另外我的 SQL 分析器声称该查询执行了两次):
exec sp_executesql N'SELECT 
CASE WHEN ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[SettingGroups] AS [Extent1]
WHERE ([Extent1].[Group] = @p__linq__0) AND ([Extent1].[Category] = @p__linq__1)
)) THEN cast(1 as bit) WHEN ( NOT EXISTS (SELECT
1 AS [C1]
FROM [dbo].[SettingGroups] AS [Extent2]
WHERE ([Extent2].[Group] = @p__linq__0) AND ([Extent2].[Category] = @p__linq__1)
)) THEN cast(0 as bit) END AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]',N'@p__linq__0 nvarchar(4000),@p__linq__1 nvarchar(4000)',@p__linq__0=N'Cleanup',@p__linq__1=N'Mediator'

现在我只能想到创建存储过程来解决这个问题,但我当然更愿意将代码保留在 LINQ 中。

有没有办法用 EF 使这样的“存在”检查运行得更快?

我应该提到我还在 n 层架构中使用自跟踪实体。在某些情况下,某些实体的 ChangeTracker 状态设置为“已添加”,即使它们已存在于数据库中。这就是为什么如果更新数据库导致插入失败异常,我使用检查来相应地更改 ChangeTracker 状态。

最佳答案

尝试按组和类别向数据库表“SettingGroups”添加索引。

顺便说一句,这会产生类似的 sql 吗?

var ok = context.SettingGroups.Any(sg => sg.Group==settingGroup && sg.Category==settingCategory);

关于linq - 优化 Entity Framework 中的 LINQ Any() 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4722541/

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