2012-02-25 6 views
12

私はしばらくこれに苦労していますので、QueryOverの専門家が助けてくれることを願っています。ここでidはリストにありません

私はブログ記事のリストを持っています。あなたは各ブログ投稿に投票することができます。ユーザーが投票していない投稿のリストを(他のものの中でも)受け取ることを希望します。

まず私のような何かを考えていた:

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

(existingBlogPostVoteIdsは投票ブログ記事のIDSである)しかし、これはQueryOverフレームワークには存在しません。

私は、このような基準でそれを行うことができることが分かった:

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

しかし、私はQueryOverない基準でこれを行うにはでしょう。

これはどのようにQueryOverで行われますか?

答えて

23

を見て、それはNHibernateのために動作しない場合は、私の構文は、LINQ to SQLの中で動作します知っています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()); 

これは、あなたが探している結果をもたらすはずです。

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

は、必要に応じて、これはで行うことができます。私はいかがNot.IsIn()ここでこの答え(Subqueries with QueryOver

関連する問題