2012-08-08 52 views
5

下面是一個簡單的類:RavenDB - 爲什麼在通過Id查詢文檔時,.Load <>返回值而Query <>不?

public class Person 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
} 

當我把它保存在RavenDB它得到一些標識assinged,說這是1,那麼我指定此

var person = session.Load<Person>("Person/1") 

回報的人,但這個

var person = session.Query<Person>().First(p => p.Id == 1) 

出錯並表示'序列不包含任何元素'。我不明白爲什麼。

回答

11

按ID加載文檔是ACID operation。換句話說,當你保存文檔時,它可用於檢索。

另一方面,查詢文檔遵循「最終一致性」的no-sql概念。您正在查詢索引,並且該索引可能有或沒有時間完全構建。

在您的示例中,索引仍舊陳舊。如果你等了很長時間,你的查詢將會正常返回。或者,您可以通過使用WaitForNonStaleResults自定義來告訴Raven等待,但這會產生危險的副作用 - 特別是在繁忙的索引中。你可以在這裏閱讀更多關於陳舊的索引查詢:http://ravendb.net/docs/client-api/querying/stale-indexes

一般來說,如果你知道文檔的ID,你應該總是使用.Load()。對於實際需要索引查找的事情,使用.Query()進行保留。在你的情況下,一個合理的查詢可能是:

var person = session.Query<Person>().Where(p => p.Name == "Joe").FirstOrDefault(); 
+0

明確的東西給我。查詢Id以外的屬性工作得很好。我只是無法弄清楚Id問題。謝謝你的幫助。 – user981375 2012-08-08 15:27:19

+0

陳舊和非陳舊的東西是非常有用的。謝謝你指出。 – 2012-10-29 14:46:04

相關問題