RavenDB—为什么,按Id查询文档时,.Load<&燃气轮机;返回值并查询<&燃气轮机;不是吗?

RavenDB—为什么,按Id查询文档时,.Load<&燃气轮机;返回值并查询<&燃气轮机;不是吗?,ravendb,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.Load(“person/1”) 返回我指定的人员,但此 var pers

下面是一个简单的类:

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.Load(“person/1”)
返回我指定的人员,但此

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

出错并说“序列不包含元素”。我不明白为什么。

按文档ID加载文档是一个非常困难的问题。换句话说,保存文档的那一刻,就可以进行检索

另一方面,查询文档遵循“最终一致性”的无sql概念。您正在查询一个索引,该索引可能有时间完全构建,也可能没有时间完全构建

在您的示例中,索引仍然过时。如果您等待的时间足够长,您的查询将正确返回。或者,您可以使用WaitForNonSaleResults定制告诉Raven等待,但这可能会产生危险的副作用,尤其是在繁忙的索引上。您可以在此处阅读有关过时索引查询的更多信息:

通常,如果您知道文档的Id,则应始终使用.Load()。使用.Query()保留实际需要索引查找的内容。在您的情况下,合理的查询可能是:

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

这为我澄清了一些事情。查询Id以外的属性效果很好。我就是搞不懂身份证的问题。谢谢你的帮助。陈腐和不陈腐的东西真的很有用。谢谢你指出这一点。