НГибернейт:Фильтрация запросов по списку значений с использованием критериев

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

  •  20-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь фильтровать по списку значений, используя API критериев.Я подозреваю, что это невозможно, я просто спрашиваю здесь, чтобы убедиться.

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

Отображение:

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

Предполагается, что у меня есть список гидов (на самом деле это еще один подзапрос).Я хочу отфильтровать все объекты, в списке которых есть хотя бы один гид.

Sql будет выглядеть так:

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

С Criteria API это кажется невозможным.

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

Выбрасывает исключение.

Это было полезно?

Решение

Ваш запрос не будет работать, поскольку свойство e.Guids, переданное в подзапрос, не является единственным значением.Чтобы сделать это таким образом, вы на самом деле пытаетесь выполнить пересечение и проверить, что это пересечение не пусто, чего, к сожалению, не существует в критериях API, хотя вы, вероятно, могли бы сделать это с помощью Linq.

Вероятно, вы все равно могли бы сделать это, если бы ваши Guid были сущностями с соответствующими свойствами (свойство Value содержит фактический Guid) и существовала двунаправленная связь:

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

ICriteria query = session.CreateCriteria(typeof (Entity))
  .Add(Subqueries.In("Id", subquery2));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top