NHibernate: filtrage de requêtes sur une liste de valeurs à l'aide de critères

StackOverflow https://stackoverflow.com/questions/1047895

  •  20-08-2019
  •  | 
  •  

Question

J'essaie de filtrer une liste de valeurs à l'aide de l'API de critères. Je soupçonne que ce n'est pas possible, je demande simplement pour être sûr.

class Entity
{
  int id { get; set; }
  IList<Guid> Guids { get; set; }
}

Le mappage:

<class name="Entity">
  <id ...></id>
  <bag name="Guids" table="Entity_Guids">
    <key column="Entity_FK"/>
    <element column="Guid"/>
  </bag>
</class>

Supposons que j'ai une liste de Guids (en fait, c'est une autre sous-requête). Je souhaite filtrer toutes les entités où au moins un guide figure dans la liste des guides.

Sql ressemblerait à ceci:

SELECT * 
FROM Entity e 
  inner join Entity_Guids eg 
    on  e.id = eg.Entity_FK
WHERE 
  eg.Guid in (subquery)

Avec l'API Criteria, cela semble impossible.

ICriteria query = session
  .CreateCriteria(typeof(Entity), "e")
  .Add(Subqueries.In("e.Guids", subquery))

Lance une exception.

Était-ce utile?

La solution

Votre requête ne fonctionnera pas car la propriété e.Guids transmise à la sous-requête n'est pas une valeur unique. Pour ce faire, vous essayez réellement de réaliser une intersection et de vérifier que cette intersection n’est pas vide, ce qui n’existe malheureusement pas dans l’API des critères, bien que vous puissiez probablement le faire avec Linq.

Vous pouvez probablement le faire si vos Guids sont des entités dotées des propriétés appropriées (la propriété Value contient le Guid actuel) et qu'il existe une relation bidirectionnelle:

var subquery2 = DetachedCriteria.For<GuidEntity>()
  .Add(Subqueries.In("Value", subquery))
  .SetProjection("Entity_FK");

ICriteria query = session.CreateCriteria(typeof (Entity))
  .Add(Subqueries.In("Id", subquery2));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top