gpt4 book ai didi

performance - Entity Framework 查询很慢,但 SqlQuery 中的相同 SQL 很快

转载 作者:行者123 更新时间:2023-12-03 05:09:49 24 4
gpt4 key购买 nike

我看到一些非常奇怪的性能,与使用 Entity Framework Code-First 和 .NET Framework 版本 4 的非常简单的查询相关。LINQ2Entities 查询如下所示:

 context.MyTables.Where(m => m.SomeStringProp == stringVar);

这需要超过 3000 毫秒的时间来执行。生成的 SQL 看起来非常简单:

 SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
...
FROM [MyTable] as [Extent1]
WHERE [Extent1].[SomeStringProp] = '1234567890'

当通过 Management Studio 运行时,此查询几乎立即运行。当我更改 C# 代码以使用 SqlQuery 函数时,它会在 5-10 毫秒内运行:

 context.MyTables.SqlQuery("SELECT [Extent1].[ID] ... WHERE [Extent1].[SomeStringProp] = @param", stringVar);

因此,完全相同的 SQL,在两种情况下都会对生成的实体进行更改跟踪,但两者之间的性能差异很大。给出了什么?

最佳答案

找到了。原来是SQL数据类型的问题。数据库中的 SomeStringProp 列是 varchar,但 EF 假定 .NET 字符串类型是 nvarchar。在查询数据库进行比较期间产生的翻译过程需要很长时间。我认为 EF 教授在这里让我有点误入歧途,正在运行的查询的更准确表示如下:

 SELECT [Extent1].[ID], [Extent1].[SomeStringProp], [Extent1].[SomeOtherProp],
...
FROM [MyTable] as [Extent1]
WHERE [Extent1].[SomeStringProp] = N'1234567890'

因此最终的修复是注释代码优先模型,指示正确的 SQL 数据类型:

public class MyTable
{
...

[Column(TypeName="varchar")]
public string SomeStringProp { get; set; }

...
}

关于performance - Entity Framework 查询很慢,但 SqlQuery 中的相同 SQL 很快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15767803/

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