C # + Castle Activerecord: hasAndBelongsToMany und Sammlungen
-
02-07-2019 - |
Frage
Lassen Sie uns sagen, ich habe viele-zu-viele-Beziehung (mit dem Active hasAndBelongsToMany Attribut) zwischen Post und Schlagworte (Domain Objektnamen, die Unschuldigen zu schützen geändert), und ich wollte
FindAllPostByTags(IList<Tag> tags)eine Methode wie , die alle Beiträge zurück das haben alle (nicht nur einige) der Variablen in den Parameter. Jede Art und Weise ich dies entweder mit NHibernate Ausdrücke oder HQL erreichen könnte? Ich habe durch die HQL-Dokumentation gesucht und kann nichts finden, dass meine Bedürfnisse. Ich hoffe, ich bin nur fehlt etwas offensichtlich!
Lösung
Sie können auch nur eine IN
Anweisung
DetachedCriteria query = DetachedCriteria.For<Post>();
query.CreateCriteria("Post").Add(Expression.In("TagName", string.Join(",",tags.ToArray()) );
Ich habe nicht kompiliert, dass so könnte es Fehler haben
Andere Tipps
ich ein System zur Hand mit einem Schloss nicht gerade jetzt installieren, so dass ich nicht testen oder diese kompilieren, aber der Code unten sollte über das tun, was Sie wollen.
Junction c = Expression.Conjunction();
foreach(Tag t in tags)
c = c.Add( Expression.Eq("Tag", t);
return sess.CreateCriteria(typeof(Post)).Add(c).List();
Ich hatte gerade das gleiche Problem und versuchte, die HQL-Dokumentation zu lesen, aber einige der Features, scheinen nicht in NHibernate (mit-Schlüsselwort zum Beispiel) umgesetzt werden
beenden ich mit dieser Art von Lösung:
select p FROM Post p JOIN p.Tags tag1 JOIN p.Tags tag2 WHERE tag1.Id = 1 tag2.Id = 2
Bedeutung, dynamisch die HQL bauen für jeden Tag verwenden beitreten, dann treffen Sie die Auswahl in Ihrer WHERE-Klausel. Das funktionierte für mich. Ich habe versucht, das Gleiche mit einem DetachedCriteria zu tun, sondern lief in Schwierigkeiten bei dem Versuch, dem Tisch mehrmals zu verbinden.