5

Tengo el siguiente modelo de datos:Cómo hacer varias combinaciones con los criterios del API NHibernate

Page 
- Id  // Pk 
- Type // int 

Section 
- Id  // Pk 
- Page // Fk 

Comment 
- Id  // Pk 
- Section // Fk 
- Date // DateTime 

estoy tratando de consultar todos los comentarios que se asocian a una determinada página (Say page.id = 2 y la página .Type = 1) dentro de un límite de tiempo. Lo probé así:

var criteria = session.CreateCriteria<Comment>() 

    .Add(Restrictions.Eq("Section.Page.Id", pageId)) 
    .Add(Restrictions.Eq("Section.Page.Type", pageType)) 
    .Add(Restrictions.Ge("Date", start)) 
    .Add(Restrictions.Lt("Date", end)); 

Sin embargo, esto no funciona como consigo un error dice "No se pudo resolver la propiedad: Página de: TestNamespace.Comment". Esto normalmente indicaría errores de mapeo, pero funciona en todos los demás casos, por lo que me inclino a creer que el error radica en la consulta.

Para empeorar las cosas, Comment.Section podría ser nulo en algunos casos (hay comentarios que no están asociados con una sección o página). En ese caso, quiero ignorar esos comentarios.

¿Algún consejo?

Gracias!

+0

Se puede añadir la definición para el tipo de pérdida que los criterios se basa? – Richard

+0

Um, copié ese código de alguna parte ... el brillo debería ser un comentario en realidad. Edité la publicación y solucioné el error. – user315648

Respuesta

4
var criteria = session.CreateCriteria<Comment>() 
    .CreateAlias("Section", "section") 
    .CreateAlias("section.Page", "page") 
    .Add(Restrictions.Eq("page.Id", pageId)) 
    .Add(Restrictions.Eq("page.Type", pageType)) 
    .Add(Restrictions.Ge("Date", start)) 
    .Add(Restrictions.Lt("Date", end)); 

He actualizado el código según su comentario. La segunda línea se agregó específicamente, y la tercera línea está utilizando el alias en la segunda línea en lugar de la propiedad, y así sucesivamente.

+0

Eso da un error: ERROR: 42P01: falta la entrada FROM-clause para la tabla – user315648

+0

Compruebe la respuesta actualizada por favor. – Meligy

+0

¡Funciona ahora! ¡Gracias! – user315648

0

Puede utilizar también otros createCriteria llama a navegar por la estructura de base de datos

var criteria = session.CreateCriteria<Comment>() 
       .Add(Restrictions.Ge("Date", start)) 
       .Add(Restrictions.Lt("Date", end)) 
       .CreateCriteria("Section") 
       .CreateCriteria("Page") 
       .Add(Restrictions.Eq("Id", pageId)) 
       .Add(Restrictions.Eq("Type", pageType)); 
Cuestiones relacionadas