2012-02-25 61 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