【问题标题】:Decimal/Date Sorting With Entity Framework Core and SQLite使用 Entity Framework Core 和 SQLite 进行小数/日期排序
【发布时间】:2019-09-01 03:41:17
【问题描述】:

使用 Entity Framework Core(代码优先)和 SQLite,Guid 存储为二进制,但 Decimal 和 Date 字段存储为 Microsoft 提供程序的文本。

我可以理解他们可能不希望 DOUBLE 的货币金额不精确,因此使用文本。

如果我需要排序怎么办? Entity Framework Core 是否足够聪明,可以按预期进行排序(但速度较慢,因为它需要解析所有内容!),还是会按字母排序而不是按数字排序?我不希望它在 2 点之前返回 100。

我必须做一些事情,比如“给我最新的订单”,那么最好的方法是什么?我想确保它能够正常工作。

切换到 System.Data.SQLite 提供程序以 UNIX 格式存储日期是否更好(Microsoft 的提供程序不支持此功能)?然后我必须自己来回解析还是它可以自动处理它?

【问题讨论】:

  • 看看这个帖子:Sorting dates in sqlite database?
  • 实际上它存储为“2019-04-10 15:35:17.8548953Z”所以我猜排序应该适用于字符串。但是对于存储为“1”和“200”的十进制,我们不能说相同
  • 查看 EF Core 文档的 SQLite query limitations

标签: sqlite asp.net-core .net-core entity-framework-core system.data.sqlite


【解决方案1】:

我自己仍在学习 system.data.sqlite,但我知道您可以创建自定义排序规则并将其分配给您的列。排序规则既可以分配给表列,也可以只分配给使用标准 sqlite SQL 语法和 COLLATE 关键字的特定视图或查询。

这不是一个完整的示例/教程,但对于初学者来说,请访问the Microsoft.data.sqlite docs。另见this stack overflow answer。这些只是提示,但提供了一致的方法来执行此操作。请记住,sqlite 是一个进程内数据库引擎,因此它应该仍然相当高效,并且仍然允许以正常方式使用数据库,而无需在查询之间不断注入自定义逻辑。一旦您定义并正确注册了自定义排序规则,它应该是相当无缝的,也许唯一的额外要求是附加例如COLLATE customDecimal 到 ORDER BY 子句。

自定义排序规则函数会将字符串值转换为适当的数字类型并返回比较结果。它与原生 .Net IComparer 和 IComparison 接口/实现非常相似。

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 2019-10-25
    • 1970-01-01
    • 2020-01-30
    • 2021-03-08
    • 1970-01-01
    • 2019-01-25
    • 2021-04-09
    • 2018-08-02
    相关资源
    最近更新 更多