RavenDB - 为什么,当通过Id查询文档时,.Load <>返回值而Query <>不返回?

use*_*375 5 ravendb

这是一个简单的类:

public class Person
{
    public int Id {get; set;}
    public string Name {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

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

var person = session.Load<Person>("Person/1")
Run Code Online (Sandbox Code Playgroud)

返回我指定的人但是这个

var person = session.Query<Person>().First(p => p.Id == 1)
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*int 11

按ID分类加载文档是ACID操作.换句话说,在您保存文档的那一刻,它可供检索.

另一方面,查询文档遵循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();
Run Code Online (Sandbox Code Playgroud)