NHibernate: filtro query su un elenco di valori utilizzando criteri
-
20-08-2019 - |
Domanda
Sto cercando di filtrare in base a un elenco di valori utilizzando l'API dei criteri. Ho il sospetto che ciò non sia possibile, sto solo chiedendo qui per esserne sicuro.
class Entity
{
int id { get; set; }
IList<Guid> Guids { get; set; }
}
La mappatura:
<class name="Entity">
<id ...></id>
<bag name="Guids" table="Entity_Guids">
<key column="Entity_FK"/>
<element column="Guid"/>
</bag>
</class>
Suppongo di avere un elenco di guide (in realtà questa è un'altra sottoquery). Voglio filtrare tutte le entità in cui almeno una guida è nell'elenco delle guide.
Sql sarebbe simile a questo:
SELECT *
FROM Entity e
inner join Entity_Guids eg
on e.id = eg.Entity_FK
WHERE
eg.Guid in (subquery)
Con Criteria API, questo sembra impossibile.
ICriteria query = session
.CreateCriteria(typeof(Entity), "e")
.Add(Subqueries.In("e.Guids", subquery))
Genera un'eccezione.
Soluzione
La tua query non funzionerà perché la proprietà e.Guids passata alla sottoquery non è un valore singolo. Per farlo in questo modo stai effettivamente cercando di eseguire un'intersezione e verificare che quell'intersezione non sia vuota, che purtroppo non esiste nei criteri api, anche se probabilmente potresti farlo con Linq.
Probabilmente potresti ancora farlo se le tue Guide erano entità con le proprietà appropriate (la proprietà Value contiene la Guida effettiva) e c'era una relazione bidirezionale:
var subquery2 = DetachedCriteria.For<GuidEntity>()
.Add(Subqueries.In("Value", subquery))
.SetProjection("Entity_FK");
ICriteria query = session.CreateCriteria(typeof (Entity))
.Add(Subqueries.In("Id", subquery2));