2012-02-25 58 views
12

我一直在为此苦苦挣扎,所以希望QueryOver的一些专家能够提供帮助。查询其中id不在列表中

我有一个博客文章列表。您可以对每篇博文进行投票,我希望(除其他外)收到用户未投票的帖子列表。

首先,我想这样做是这样的:

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

(existingBlogPostVoteIds是投票的相关博客文章的ID)

但是,这并不在QueryOver框架存在。

我发现我能做到这一点在这样的标准:

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

但我会做到这一点的QueryOver,而不是标准。

这将如何在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 2012-02-27 18:39:26

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