Pregunta

Estoy tratando de filtrar por una lista de valores usando la API de criterios. Sospecho que esto no es posible, solo estoy preguntando aquí para estar seguro.

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

El mapeo:

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

Supongo que tengo una lista de Guías (en realidad, esta es otra subconsulta). Quiero filtrar todas las Entidades donde al menos un guid está en la lista de Guías.

Sql se vería así:

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

Con Criteria API, esto parece ser imposible.

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

Lanza una excepción.

¿Fue útil?

Solución

Su consulta no funcionará porque la propiedad e.Guids pasada a la subconsulta no es un valor único. Para hacerlo de esta manera, en realidad está intentando realizar una intersección y verificar que esa intersección no esté vacía, lo que desafortunadamente no existe en la API de criterios, aunque probablemente podría hacerlo con Linq.

Probablemente aún podría hacer esto si sus Guías fueran entidades con las propiedades apropiadas (la propiedad Valor contiene la Guía real) y hubiera una relación bidireccional:

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

ICriteria query = session.CreateCriteria(typeof (Entity))
  .Add(Subqueries.In("Id", subquery2));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top