查询,其中id不在列表中

时间:2012-02-25 13:35:42

标签: nhibernate queryover

我一直在努力解决这个问题,所以我希望你们中的一些QueryOver专家可以提供帮助。

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

首先,我在考虑做类似的事情:

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

(existingBlogPostVoteIds是投票博客帖子的ID)

但这在QueryOver框架中不存在。

我发现我可以在Criteria中这样做:

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

但我想在QueryOver而不是Criteria中这样做。

如何在QueryOver中完成?

2 个答案:

答案 0 :(得分:23)

Not.IsIn()

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

也可以在Linq提供商中完成:

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

答案 1 :(得分: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