Question

Disons que j'ai une relation plusieurs à plusieurs (en utilisant l'attribut HasRandBelongsToMany d'ActiveRecord) entre les publications et les balises (les noms d'objet de domaine ont été modifiés pour protéger l'innocent) et que je voulais une méthode comme

FindAllPostByTags(IList<Tag> tags)
qui renvoie toutes les publications qui ont toutes (pas seulement certaines) les balises dans le paramètre. Est-ce que je pourrais le faire avec NHibernate Expressions ou HQL? J'ai parcouru la documentation HQL et je n'ai rien trouvé qui corresponde à mes besoins. J'espère qu'il me manque quelque chose d'évident!

Était-ce utile?

La solution

Vous pouvez également simplement utiliser une instruction IN

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

Je n'ai pas compilé cela pour qu'il puisse avoir des erreurs

Autres conseils

Je n'ai pas de système sous la main avec une installation de Castle pour le moment. Je ne l'ai donc ni testé ni compilé, mais le code ci-dessous devrait vous permettre de faire ce que vous voulez.

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

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

Je viens d'avoir le même problème et j'ai essayé de lire la documentation HQL. Cependant, certaines fonctionnalités ne semblent pas être implémentées dans NHibernate (avec mot-clé par exemple)

Je me suis retrouvé avec ce type de solution:

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

Signification, construisez dynamiquement la HQL en utilisant join pour chaque balise, puis faites la sélection dans votre clause WHERE. Cela a fonctionné pour moi. J'ai essayé de faire la même chose avec un DetachedCriteria mais j'ai eu des problèmes en essayant de joindre la table plusieurs fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top