2012-08-08 9 views
5

Aquí es una clase simple:RavenDB: ¿por qué, al consultar documentos por Id, .Load <> devuelve valor y Query <> no?

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

Cuando guardo esto en RavenDB se pone alguna identificación assinged, dicen que es 1, entonces este

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

rendimientos persona que se especifica pero esto

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

errores y dice que 'la secuencia no contiene elementos'. No entiendo por qué.

Respuesta

11

Cargando documentos por su ID es ACID operation. En otras palabras, en el momento de guardar el documento, está disponible para su recuperación.

Por otro lado, la consulta de documentos sigue el concepto sin sql de "coherencia eventual". Está consultando un índice, y ese índice puede o no haber tenido tiempo para compilarse por completo.

En su ejemplo, el índice sigue añejo. Si esperó el tiempo suficiente, su consulta se devolverá correctamente. Alternativamente, puede decirle a Raven que espere usando la personalización WaitForNonStaleResults, pero esto puede tener efectos secundarios peligrosos, especialmente en un índice ocupado. Puede leer más sobre las consultas de índice obsoleta aquí: http://ravendb.net/docs/client-api/querying/stale-indexes

En general, si conoce el Id del documento, siempre debe usar .Load(). Reserve usando .Query() para cosas que realmente requerirían búsqueda de índice. En su caso, una consulta razonable podría ser:

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

que me aclara las cosas. La consulta de propiedades distintas de Id funcionó bien. Simplemente no pude entender ese problema de Id. Gracias por tu ayuda. – user981375

+0

Las cosas viejas y no añejas son realmente útiles. Gracias por señalarlo. –

Cuestiones relacionadas