我一直在努力解决这个问题,所以我希望你们中的一些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中完成?
答案 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)