C # + Castle ActiveRecord: HasAndBelongsToMany et collections
-
02-07-2019 - |
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!
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.