2012-08-08 37 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

相关问题