API критериев Nhibernate для многих-ко-многим

Моя объектная модель следующая:

У элемента много тегов, и тег может принадлежать многим элементам.

Я хотел бы выполнить следующий запрос, используя критерии.

SELECT * FROM Item item
WHERE item.Id in (Select it.ItemId from dbo.ItemToTags it where it.Tag_id = 'ONE')
AND item.Id in (Select it.ItemId from dbo.ItemToTags it where it.Tag_id = 'TWO')

Это означает, что я хотел бы дать коллекцию возможных тегов, а затем предоставить все элементы, которые имеют все эти теги:

Я пробовал следующее, но не получаю результатов:

CreateCriteria<Item>().CreateAlias("Tags", "Tags");
if (AndQuery) {
   foreach(var tag in Tags)
   {
      criteria.Add(Subqueries.PropertyEq("Tags.Id", DetachedCriteria.For<Tag>().Add(Restrictions.Eq("Id", tag))                                                   .SetProjection(Projections.Property("Id"))));
   }
} 

person Patrick    schedule 04.10.2010    source источник


Ответы (1)


Я не уверен, можно ли перевести ваш запрос так:

SELECT * FROM Item item 
join ItemToTags itt on itt.ItemId = item.Id
join Tags t on itt.TagId = t.Id
where t.Id in ('ONE','TWO')

Если да, то у вас должно получиться:

CreateCriteria<Item>().CreateAlias('Tags','t')
   .Add(Restrictions.In('t.Id',new List<string>{'TWO','ONE'}).List<Item>();

Предполагается, что у вас есть коллекция тегов, отображенная на Item.

hth

person sirrocco    schedule 05.10.2010
comment
Спасибо за ответ, но это даст мне отношение ИЛИ. Ищу выпуск И! Вот почему мой запрос содержит два подзапроса а не и в! - person Patrick; 05.10.2010