我试图指示RavenDB按数字字段对特定索引进行排序,该类看起来像这样;
class Level {
public int Number {
get;
set;
}
public string Id {
get;
set;
}
// other properties not listed
}
所以我用一个简单的循环创建了15,000个文档,数字字段从1到15000逐步设置。到目前为止,这个工作正常。
现在当我查询它时,我希望它默认情况下按照数字的顺序对它们进行排序。所以我的第一次尝试就是使用标准OrderBy
。
var query = RavenSession
.Query<Level>()
.Customize(c => c.WaitForNonStaleResults())
.OrderBy(r => r.Number)
.ToList();
这肯定不起作用。我最终得到了一个类似于......的列表。
[levels/1]
[levels/3751]
[levels/8583]
[levels/2828]
这对我来说甚至都没有意义。所以我尝试指定一个索引。
public class Level__ByNumber : AbstractIndexCreationTask<Models.Level> {
public Level__ByNumber() {
Map = results => from result in results
select new {
Id = result.Id,
Number = result.Number
};
Sort(n => n.Number, SortOptions.Int);
}
}
然后完全按照我假设索引被调用...
RavenQueryStatistics statistics;
var query = RavenSession
.Query<Level, Level_ByNumber>()
.Customize(c => c.WaitForNonStaleResults())
.Statistics(out statistics);
if(searchable != null) {
query = query.Search(n => n.Number, searchable);
}
var results = query.ToList();
仍然没有运气;列表以奇怪的顺序被扰乱。我也试过SortOptions.Short
和SortOptions.String
但没有用。我究竟做错了什么?如何使此索引只按预期顺序返回对象?
我已经彻底阅读了有关此文档的文档,其他堆栈溢出问题(例如This)和建议的信息也不起作用。
答案 0 :(得分:1)
你编写的代码对我有效(你在索引名称中有一个额外的下划线,但我认为这不会影响任何事情) 请比较一下这个单元测试与你为我传递的内容有何不同之处:
[TestMethod]
public void TestMethod()
{
using (var session = _store.OpenSession())
{
session.Store(new Level{ Number = 2828});
session.Store(new Level { Number = 8583 });
session.Store(new Level { Number = 3751 });
session.Store(new Level{ Number = 1});
session.SaveChanges();
RavenQueryStatistics statistics;
var query = session.Query<Level, Level_ByNumber>().Customize(c => c.WaitForNonStaleResults()).Statistics(out statistics).OrderBy(x => x.Number);
var results = query.ToList();
Assert.AreEqual(1, results[0].Number);
Assert.AreEqual(2828, results[1].Number);
Assert.AreEqual(3751, results[2].Number);
Assert.AreEqual(8583, results[3].Number);//all pass
}
}
答案 1 :(得分:0)
我相信您的问题是您正在分析数字字段。不要那样做。
Index(n => n.Number, FieldIndexing.Analyzed);
删除它,你应该没问题。
如果这不起作用,请尝试使用Store存储您的fielding,但我认为您不需要。