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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top