2012-02-25 2 views
12

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

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

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

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

(existingBlogPostVoteIds является идентификаторами голосовавших) · блоги, ·

Но это не существует в рамках QueryOver.

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

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

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

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

ответ

23

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

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

При желании это может быть сделано в Linq также:

Session.Query<BlogPost>() 
      .Where(bp => !existingBlogPostVotes.Contains(bp.Id)); 
+0

Спасибо, что именно я искал. – Dofs

1

Что касается стандартного запроса, в котором вы используете вспомогательный запрос в предложении 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, посмотрите на этот ответ здесь (Subqueries with QueryOver)