2014-02-20 40 views
1

我試圖指示RavenDB排序一個數字字段的特定索引,類看起來像這樣;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.ShortSortOptions.String無濟於事。我究竟做錯了什麼?我如何獲得這個索引只是以預期的順序返回對象?

我已經徹底閱讀了關於此的文檔以及其他堆棧溢出問題,如This和建議的信息不起作用。

+0

(這裏使用的是你需要調用'.OrderBy了''Level__ByNumber指數(R => r.Number)'自定義 – wal

+0

後,我試圖這樣說,也沒有影響。 – Ciel

+0

你是否在註冊你的索引時開始rave​​ndb?例如'IndexCreation.CreateIndexes(typeof(Users_ByUsername).Assembly,_store)'? – wal

回答

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 
    } 
} 
在你的第二個查詢
+0

他們並沒有什麼不同,我仍然得到錯誤的結果。 – Ciel

+0

好吧,更正;我的確有'搜索'條款。但即使我刪除了,我也得到了相同的錯誤結果。 – Ciel

+0

在你身邊運行單元測試? – wal

0

我相信你的問題是你正在分析數字字段。不要這樣做。

Index(n => n.Number, FieldIndexing.Analyzed); 

刪除,你應該沒問題。

如果這不起作用,請嘗試使用Store存儲您的區域,但我不認爲您需要這樣做。

+0

我已經完成了這兩件事,但它仍然不起作用。 – Ciel

+0

我已更新我的代碼以表示更多_exactly_對我來說是什麼樣子。我忘記了我在其上放置了搜索字段,這可能會改變行爲。但我不相信它應該。 – Ciel

+0

爲了讓這一切更加清晰,我已經將100%的相關代碼放入了一個伴侶中供您觀察。但是,我不相信任何輔助代碼對它有任何影響。它僅僅是爲了讓整個過程具有極高的可重複性並縮短多個不同頁面的使用範圍:http:// pastie。org/private/bkqujjxb0aljjgs6ltmvw – Ciel