C # + Castle ActiveRecord: HasAndBelongsToMany e collezioni
-
02-07-2019 - |
Domanda
Diciamo che ho una relazione molti-a-molti (usando l'attributo ActiveRecord HasAndBelongsToMany) tra messaggi e tag (nomi di oggetti di dominio modificati per proteggere gli innocenti) e volevo un metodo come
FindAllPostByTags(IList<Tag> tags)che ritorni tutti i post che hanno tutti (e non solo alcuni) i tag nel parametro. In qualche modo avrei potuto farlo con NHibernate Expressions o HQL? Ho cercato nella documentazione HQL e non sono riuscito a trovare nulla adatto alle mie esigenze. Spero che mi manchi qualcosa di ovvio!
Soluzione
Puoi anche semplicemente usare un'istruzione IN
DetachedCriteria query = DetachedCriteria.For<Post>();
query.CreateCriteria("Post").Add(Expression.In("TagName", string.Join(",",tags.ToArray()) );
Non l'ho compilato in modo che possa contenere errori
Altri suggerimenti
Non ho un sistema a portata di mano con un'installazione Castle in questo momento, quindi non ho testato o compilato questo, ma il codice qui sotto dovrebbe fare quello che vuoi.
Junction c = Expression.Conjunction();
foreach(Tag t in tags)
c = c.Add( Expression.Eq("Tag", t);
return sess.CreateCriteria(typeof(Post)).Add(c).List();
Ho appena avuto lo stesso problema e ho provato a leggere la documentazione HQL, tuttavia alcune funzionalità non sembrano essere implementate in NHibernate (ad esempio con la parola chiave)
Ho finito con questo tipo di soluzione:
select p FROM Post p JOIN p.Tags tag1 JOIN p.Tags tag2 WHERE tag1.Id = 1 tag2.Id = 2
Significato, crea dinamicamente l'HQL usando join per ogni tag, quindi fai la selezione nella tua clausola WHERE. Questo ha funzionato per me. Ho provato a fare la stessa cosa con un DetachedCriteria ma ho avuto problemi quando ho provato a unirmi alla tabella più volte.