RavenDB - 为何,在通过Id查询文档时,.Load<>返回值和查询<>才不是?

时间:2012-08-08 15:03:40

标签: ravendb

这是一个简单的类:

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

当我在RavenDB中保存它时会得到一些Id,但是它是1,然后这个

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

返回我指定的人但是

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

出错并说'序列不包含任何元素'。我不明白为什么。

1 个答案:

答案 0 :(得分: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();