API критериев Nhibernate для многих ко многим - PullRequest
1 голос
/ 05 октября 2010

Моя объектная модель выглядит следующим образом:

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

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

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"))));
   }
} 

1 Ответ

0 голосов
/ 05 октября 2010

Я не уверен, что ваш запрос может быть переведен как:

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>();

Это предполагаетколлекция меток, отображаемая на элементе.

hth

...