【问题标题】:RavenDB OrderByRavenDB 排序依据
【发布时间】:2013-06-05 18:52:54
【问题描述】:

在我的 C# 应用程序中,我有一个对象集合,这些对象的 int Order 属性范围从 1 到 n

当我这样做时:

var listings = session.Query<Listing>().Where(x => !x.IsDeleted && x.CategoryId == category.Id && x.WorkflowStatus == WorkflowStatus.Published).OrderBy(x => x.Order);

我得到了一系列列表,但不是 100% 的顺序正确。按照目前的顺序:

0, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 21, 22, 23, 24, 25, 26, 28, 29, 3, 30, 31, 32, 33, 4 .... 

知道为什么OrderBy 不能完全按照应有的方式工作吗?

【问题讨论】:

  • 看起来由于某种原因将它们作为字符串
  • 什么是字符串?
  • 它认为Order 属性是一个字符串而不是一个int,如果它们是文本,这就是它的排序方式。
  • 啊,是的,我明白你的意思了。知道如何解决这个问题吗?
  • 您可以尝试OrderBy(x =&gt; (int)x.Order);,但我不确定如果它应该存储为 int,为什么它会以字符串形式返回。

标签: c# ravendb


【解决方案1】:

如果您使用的是索引,则需要为 Order 属性设置排序选项。 来自http://ravendb.net/docs/client-api/querying/static-indexes/customizing-results-order

另一方面,数值存储为文本,因此需要用户明确指定使用的数字类型,以便强制执行正确的排序机制。这很容易做到,只需在索引定义的 SortOptions 中声明所需的排序设置:

Sort(x => x.Order, SortOptions.Int);

上述索引将允许按用户年龄(1、2、3、11 等)的值进行排序。如果我们不指定此选项,它将按词法排序(1、11、2、3 等)。 默认的 SortOptions 值为字符串。适用于所有数字类型(Byte、Double、Float、Int、Long 和 Short)的值。

【讨论】:

  • 是的,但至少在他发布的代码中,没有指定索引名称。如果 RavenDB 动态生成临时索引,那么它会自动添加排序顺序。但也许它与缺少它的预定义索引匹配,所以你得到我的 +1。 :)
  • @MattJohnson 有没有办法在不使用静态索引时指定排序选项?
  • 如果 Raven 将您的查询与现有索引匹配,它将使用该索引中的排序顺序。如果它为您动态创建一个,它将根据您的数据类型创建正确的排序顺序。因此,如果您在查询中 OrderBy 一个整数,并且 raven 为您创建了一个临时索引,它将在该索引中包含整数排序顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多