gpt4 book ai didi

sql-server - EF Core 3.1 查询中 HasConversion 和 HasMaxLength 映射的不一致行为

转载 作者:行者123 更新时间:2023-12-04 13:14:50 25 4
gpt4 key购买 nike

EF Core 3.1 在按列过滤时生成低性能查询(因为缺少索引)。

导致问题的列具有以下映射:

builder.Property(p => p.Id)
.HasConversion(
value => value.Value,
dbValue => new LocationId(dbValue)
)
.HasMaxLength(50);

LocationId 是值对象

查询由以下代码生成:

_repository.Query.FirstOrDefaultAsync(l => l.Id == "DD212334234");

其中 _repository.Query 基本上是位置的 DbSet。

生成的查询是:

SELECT TOP 1 * FROM [locations] as [l] WHERE CAST([l].[Id] AS nvarchar(max)) = 'DD212334234'

注意转换为 nvarchar(max)。列 ID 为 nvarchar(50) 并具有索引。上述针对 250 万条记录的查询执行了大约 1.2 秒。如果我删除 CAST 并运行查询,它将完成 100 毫秒。

如果您能帮助解决这个问题,我们将不胜感激。

更新:我的 DbContext 构建于:

builder.UseSqlServer(options.ConnectionString, x =>
{
x.MigrationsAssembly(assemblyName);
x.MigrationsHistoryTable($"__migrations_{contextName}");
x.UseNetTopologySuite();
});

另一个更新:

如果我注释掉 .HasConversion(...),则生成的查询没有 CAST。LocationId是这样的:

public class LocationId : ValueObject
{
private LocationId(string value)
{
Value = value.ToUpperInvariant();
}

public string Value { get; }

public static implicit operator string(LocationId c) => c.Value;
public static explicit operator LocationId(string s) => new LocationId(s);

...
}

最佳答案

运营商问题

public static implicit operator string(LocationId c) => c.Value;
public static explicit operator LocationId(string s) => new LocationId(s);

理解表达式

l => l.Id == "DD212334234"

实际上是

l => (string)l.Id == "DD212334234"

这导致翻译后的 SQL 中的 CAST。

最初我无法重现它,因为在我的测试中这两个转换都是隐式的

public static implicit operator string(LocationId c) => c.Value;
public static implicit operator LocationId(string s) => new LocationId(s);

所以上面的表达式其实就是

l => l.Id == (LocationId)"DD212334234"

并且在生成的SQL中不引入CAST。

因此解决方案是使运算符 LocationId 隐式,或使用显式转换

l => l.Id == (LocationId)"DD212334234"

LocationId构造函数

l => l.Id == new LocationId("DD212334234")

LocationId 变量。

或者一般来说,客户端类型比较。

关于sql-server - EF Core 3.1 查询中 HasConversion 和 HasMaxLength 映射的不一致行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61540424/

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