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.

È stato utile?

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));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top