Запрос, где id нет в списке - PullRequest
       1

Запрос, где id нет в списке

12 голосов
/ 25 февраля 2012

Я боролся с этим некоторое время, поэтому я надеюсь, что некоторые из вас, эксперты QueryOver, могут помочь.

У меня есть список постов в блоге.Вы можете голосовать за каждое сообщение в блоге, и я хотел бы (среди прочего) получить список сообщений, за которые пользователь не голосовал.

Сначала я думал о том, чтобы сделать что-то вроде:

Session.QueryOver<BlogPost>()
.WhereRestrictionOn(bp => bp.Id)
.NotIn(existingBlogPostVotes);

(существующиеBlogPostVoteIds - это идентификаторы проголосовавших постов)

Но этого не существует в структуре QueryOver.

Я обнаружил, что могу сделать это в критериях, например так:

var crit =
     Session.CreateCriteria<BlogPost>()
     .Add(Restrictions.Not(Restrictions.In("Id",existingBlogPostVotes)));

Но я бы сделал это в QueryOver, а не в Criteria.

Как это можно сделать в QueryOver?

Ответы [ 2 ]

23 голосов
/ 26 февраля 2012

Как насчет Not.IsIn():

   Session.QueryOver<BlogPost>()
          .WhereRestrictionOn(bp => bp.Id)
          .Not.IsIn(existingBlogPostVotes);

При желании это можно сделать и в провайдере Linq:

   Session.Query<BlogPost>()
          .Where(bp => !existingBlogPostVotes.Contains(bp.Id));
1 голос
/ 25 февраля 2012

Как насчет стандартного запроса, в котором вы используете подзапрос в предложении where. У меня нет визуальной студии передо мной, чтобы проверить синтаксис, но по сути это запрос всех публикаций в блоге, где для текущего пользователя не существует записи blogPostVote.

Session.QueryOver<BlogPost>()
.Where(bp => bp.Id)
.Where(
    !Session.QueryOver<BlogPostVotes>()
    .Where(blogPostVotes => blogPostVotes.BlogPostId == bp.Id)
    .Where(blogPostVotes => blogPostVotes.UserId == currentUserId)
    .Any());

Это должно дать вам результат, который вы ищете. Я знаю, что мой синтаксис будет работать в Linq To Sql, если он не работает для NHibernate, посмотрите этот ответ здесь ( Подзапросы с QueryOver )

...