EF Core 2.1 浮点数转换问题
EF Core 2.1 Float Number Conversion Issue
我 运行 在 Entity Framework Core 2.1 中遇到查询生成问题。
我有一个问题
var q = KostenSchweissen.Where(k => k.Grenze >= ewd)
.OrderBy(k => k.Grenze)
.FirstOrDefault();
其中 KostenSchweissen.Grenze
是整数,但 ewd
是浮点数。
所以这会查找 "Grenze" 大于或等于向下传递的值的第一行。
这个 运行 以前很好(EF Core 1.x,不确定 2.0),但现在它正在生成查询(来自 SQL Server Profiler):
exec sp_executesql N'SELECT TOP(1) [k].[ID], [k].[Grenze], [k].[PreisEdelstahl], [k].[PreisNormalstahl]
FROM [KostenSchweissen] AS [k]
WHERE [k].[Grenze] >= @__ewd_0
ORDER BY [k].[Grenze]',N'@__ewd_0 smallint',@__ewd_0=17
其中 ewd
为 17.1。所以这完全忽略了 ewd 是一个浮动,显然返回了错误的成本。在查询中转换为 double 或 float 不起作用,我能想到的唯一解决方法是
var q = KostenSchweissen.Where(k => k.Grenze * 1.0 >= ewd)
.OrderBy(k => k.Grenze)
.FirstOrDefault();
这显然不太好,因为它涉及到DB端计算。在我的案例中,查询不是性能关键,但我仍然想知道:这是一个错误,还是被认为是一个功能?如果是这样,为什么?这至少不是应该在某处宣布的重大更改吗?还是我只是盲目地找到它?
我试图在 EF 文档中找到任何提示 - 发行说明、重大更改、论坛...但找不到任何东西。
对于相关文档、最佳实践或任何其他可能有助于解决此问题的提示,我将不胜感激。
编辑:EF 核心团队已将此视为将在 3.0.0 中修复的错误 (https://github.com/aspnet/EntityFrameworkCore/issues/13908)。好的!
与此同时,有没有人知道我可以做什么作为解决方法?我是否必须手动查找可能发生这种情况的所有查询?
看起来这可能是 EF Core 中的错误 -
如果您注意到 .Where(k => k.Grenze >= 17.1)
将导致它使用值 17.1 生成 sql 查询,因为它不会将其生成到参数化查询中 - 当使用局部变量时,尽管它似乎正在转换它们与被映射的属性属于同一类型,这会导致舍入问题。
据我所知,这主要是预期的行为,以确保跨查询的类型一致,允许更好的索引等,尽管在 float
、double
和 decimal
的情况下它会导致潜在的舍入问题。
建议在 GitHub 上为此提出问题,因为它可能(在您的情况下)导致不正确的查询结果。
我 运行 在 Entity Framework Core 2.1 中遇到查询生成问题。
我有一个问题
var q = KostenSchweissen.Where(k => k.Grenze >= ewd)
.OrderBy(k => k.Grenze)
.FirstOrDefault();
其中 KostenSchweissen.Grenze
是整数,但 ewd
是浮点数。
所以这会查找 "Grenze" 大于或等于向下传递的值的第一行。 这个 运行 以前很好(EF Core 1.x,不确定 2.0),但现在它正在生成查询(来自 SQL Server Profiler):
exec sp_executesql N'SELECT TOP(1) [k].[ID], [k].[Grenze], [k].[PreisEdelstahl], [k].[PreisNormalstahl]
FROM [KostenSchweissen] AS [k]
WHERE [k].[Grenze] >= @__ewd_0
ORDER BY [k].[Grenze]',N'@__ewd_0 smallint',@__ewd_0=17
其中 ewd
为 17.1。所以这完全忽略了 ewd 是一个浮动,显然返回了错误的成本。在查询中转换为 double 或 float 不起作用,我能想到的唯一解决方法是
var q = KostenSchweissen.Where(k => k.Grenze * 1.0 >= ewd)
.OrderBy(k => k.Grenze)
.FirstOrDefault();
这显然不太好,因为它涉及到DB端计算。在我的案例中,查询不是性能关键,但我仍然想知道:这是一个错误,还是被认为是一个功能?如果是这样,为什么?这至少不是应该在某处宣布的重大更改吗?还是我只是盲目地找到它?
我试图在 EF 文档中找到任何提示 - 发行说明、重大更改、论坛...但找不到任何东西。
对于相关文档、最佳实践或任何其他可能有助于解决此问题的提示,我将不胜感激。
编辑:EF 核心团队已将此视为将在 3.0.0 中修复的错误 (https://github.com/aspnet/EntityFrameworkCore/issues/13908)。好的! 与此同时,有没有人知道我可以做什么作为解决方法?我是否必须手动查找可能发生这种情况的所有查询?
看起来这可能是 EF Core 中的错误 -
如果您注意到 .Where(k => k.Grenze >= 17.1)
将导致它使用值 17.1 生成 sql 查询,因为它不会将其生成到参数化查询中 - 当使用局部变量时,尽管它似乎正在转换它们与被映射的属性属于同一类型,这会导致舍入问题。
据我所知,这主要是预期的行为,以确保跨查询的类型一致,允许更好的索引等,尽管在 float
、double
和 decimal
的情况下它会导致潜在的舍入问题。
建议在 GitHub 上为此提出问题,因为它可能(在您的情况下)导致不正确的查询结果。