【问题标题】:EF Core 2.1 Float Number Conversion IssueEF Core 2.1 浮点数转换问题
【发布时间】:2019-04-08 15:15:12
【问题描述】:

我在 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 是一个浮点数,显然返回了错误的成本。在查询中转换为双精度或浮点数不起作用,我能想到的唯一解决方法是

    var q = KostenSchweissen.Where(k => k.Grenze * 1.0 >= ewd)
      .OrderBy(k => k.Grenze)
      .FirstOrDefault();

这显然不好,因为它涉及数据库端计算。在我的情况下,查询对性能并不重要,但我仍然想知道:这是一个错误,还是被认为是一个功能?如果是这样,为什么?这至少不是应该在某处宣布的重大变化吗?还是我瞎了才发现?

我试图在 EF 文档中找到任何提示 - 发行说明、重大更改、论坛...但找不到任何东西。

对于相关文档、最佳实践或任何其他可能有助于解决此问题的任何提示,我将不胜感激。

编辑:EF 核心团队已将其视为将在 3.0.0 (https://github.com/aspnet/EntityFrameworkCore/issues/13908) 中修复的错误。好的! 与此同时,有没有人知道我可以做些什么作为解决方法?我是否必须手动查找所有可能发生这种情况的查询?

【问题讨论】:

    标签: entity-framework-core ef-core-2.0 ef-core-2.1 entity-framework-core-2.1


    【解决方案1】:

    看起来这可能是 EF Core 中的一个错误 -

    如果您注意到.Where(k => k.Grenze >= 17.1) 将导致它使用值 17.1 生成 sql 查询,因为它不会将其生成为参数化查询 - 当使用局部变量时,尽管它似乎将它们转换为与属性相同的类型被比较是映射,这会导致舍入问题。

    据我所知,这主要是预期的行为,以确保跨查询的类型一致,允许更好的索引等,但在 floatdoubledecimal 的情况下,它会导致潜在的舍入问题。

    建议在 GitHub 上为此提出一个问题,因为它可能(并且在您的情况下)会导致不正确的查询结果。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2020-03-29
    • 2012-05-09
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多