Pergunta

Eu estou tentando filtrar por uma lista de valores usando a API critérios. Eu suspeito que isso não é possível, eu só estou pedindo aqui para ter certeza.

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

O mapeamento:

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

Assumindo Eu tenho uma lista de GUIDs (na verdade, estes é outra subconsulta). Eu quero filtrar todas as Entidades, onde pelo menos um guid está na lista de GUIDs.

Sql ficaria assim:

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

Com Criteria API, este parece ser impossível.

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

Lança uma exceção.

Foi útil?

Solução

A sua consulta não funcionará porque a propriedade e.Guids passado para a subconsulta não é um único valor. Para fazê-lo desta forma você está realmente tentando realizar um cruzamento e verifique se que a interseção não estiver vazia, o que infelizmente não existe na api critérios, embora você provavelmente poderia fazer isso com Linq.

Você poderia provavelmente ainda fazer isso se os seus Guids eram entidades com as propriedades adequadas (a propriedade do valor contém o Guid real) e não havia uma relação bidirecional:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top