Запрос NHibernate: строка содержится в родительском или дочернем свойстве - PullRequest
0 голосов
/ 04 февраля 2020

Я вырываю свои волосы на этом ...

Предположим, у нас есть список блогов, которым назначены теги. Пользователь ищет любой термин, и результат должен включать:

  1. Все блоги, чье имя содержит термин ИЛИ
  2. Все блоги, в которых любое имя тега содержит term
  3. Только теги, чье имя соответствует термину

Запрос SQL, который достигает этого:

declare @query varchar(20) = '%name%';
SELECT *
 FROM Blogs blog
INNER join BlogTags bt on blog.ID = bt.BlogId --join table
INNER join Tags tag on tag.Id = bt.TagId
                   and tag.name like @query -- condition 3
WHERE blog.name like @query -- condition 1
   OR tag.name like @query -- condition 2

Я пытался весь день чтобы заставить это работать в запросе NHibernate, но я всегда застреваю в условии OR, поскольку они не ссылаются на один и тот же объект. Использование Restrictions.Like, кажется, не понимает, что я хочу вложенное свойство, и фильтрация вложенного объекта обычно выполняется с использованием CreateCriteria, который недоступен внутри Restrictions.Or. Я также не нашел способа включить условие 3.

Мне все равно, выполнено ли это с помощью Query, QueryOver или CreateCriteria. В настоящее время я просто хочу, чтобы это работало:)


Возможно, уместны другие вопросы SO:

1 Ответ

0 голосов
/ 08 февраля 2020

Независимо от моего комментария выше, следующий запрос должен помочь (хитрость заключается в использовании псевдонимов). Я предполагаю, что у вас есть класс Blog, который имеет свойство List<Tag> Tags.

Blog bAlias = null;
Tag tAlias = null;

var blogs = session.QueryOver<Blog>(() => bAlias)
  .JoinAlias(() => bAlias.Tags, () => tAlias)
  .WhereRestrictionOn(_ => tAlias.Name).IsLike("%name%") // condition 3
  .Where(Restrictions.Disjunction()
     .Add(Restrictions.On<Blog>(_ => bAlias.Name).IsLike("%name%")) // condition 1
     .Add(Restrictions.On<Tag>(_ => tAlias.Name).IsLike("%name%")) // condition 2
  )
  .List<Blog>();

Однако, как и в моем комментарии выше, условие 3 на самом деле не имеет большого смысла, если вы не измените от inner join до left outer join.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...