Pregunta

Digamos que tengo una relación de muchos a muchos (usando el atributo ActiveRecord HasAndBelongsToMany) entre publicaciones y etiquetas (los nombres de objetos de dominio han cambiado para proteger a los inocentes), y quería un método como

FindAllPostByTags(IList<Tag> tags)
que devuelva todas las publicaciones que tienen todas las etiquetas (no solo algunas) en el parámetro. ¿De alguna manera podría lograr esto con NHibernate Expressions o HQL? He buscado en la documentación de HQL y no he podido encontrar nada que se ajuste a mis necesidades. ¡Espero que me esté perdiendo algo obvio!

¿Fue útil?

Solución

También puedes usar una declaración IN

DetachedCriteria query = DetachedCriteria.For<Post>();
query.CreateCriteria("Post").Add(Expression.In("TagName",  string.Join(",",tags.ToArray()) );

No lo he compilado así que podría tener errores

Otros consejos

No tengo un sistema a mano con una instalación de Castle en este momento, por lo que no probé ni compilé esto, pero el código que aparece a continuación debe hacer lo que quieras.

Junction c = Expression.Conjunction();
foreach(Tag t in tags)
    c = c.Add( Expression.Eq("Tag", t);

return sess.CreateCriteria(typeof(Post)).Add(c).List();

Acabo de tener el mismo problema e intenté leer la documentación de HQL, sin embargo, algunas de las funciones no parecen estar implementadas en NHibernate (con palabra clave, por ejemplo)

Terminé con este tipo de solución:

select p 
FROM Post p
JOIN p.Tags tag1
JOIN p.Tags tag2
WHERE
    tag1.Id = 1
    tag2.Id = 2

Significado, genere dinámicamente el HQL usando la combinación para cada etiqueta, luego haga la selección en su cláusula WHERE. Esto funcionó para mí. Intenté hacer lo mismo con un DetachedCriteria, pero tuve problemas al intentar unirme a la mesa varias veces.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top