NHibernate: фильтрация запросов по списку значений с использованием критериев - PullRequest
0 голосов
/ 26 июня 2009

Я пытаюсь отфильтровать по списку значений, используя критерии 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))

Выдает исключение.

1 Ответ

1 голос
/ 01 июля 2009

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

Возможно, вы все еще могли бы сделать это, если бы ваши Guids были сущностями с соответствующими свойствами (свойство 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...