2012-02-25 11 views
12

Sono stato alle prese con questo per un po ', quindi spero che alcuni di voi esperti QueryOver possono aiutare.Queryover dove id non è in elenco

Ho un elenco di post del blog. Puoi votare su ciascun post del blog e vorrei (tra gli altri) ricevere un elenco di post in cui l'utente non ha votato.

Prima stavo pensando di fare qualcosa di simile:

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

(existingBlogPostVoteIds è gli ID dei blogposts ritenute)

Ma questo non esiste nel quadro QueryOver.

ho scoperto che avrei potuto farlo in Criteri come questo:

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

ma vorrei farlo in QueryOver e non criteri.

Come si farebbe in QueryOver?

risposta

23

Come su Not.IsIn():

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

Opzionalmente questo potrebbe essere fatto nel Provider Linq pure:

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

Grazie, questo è esattamente quello che stavo cercando. – Dofs

1

Che dire di una query standard in cui si utilizza una query secondaria nella clausola where. Non ho studio visivo di fronte a me per verificare la sintassi, ma essenzialmente questo è interrogare tutti i post del blog in cui non esiste un record blogPostVote per l'utente corrente.

Session.QueryOver<BlogPost>() 
.Where(bp => bp.Id) 
.Where(
    !Session.QueryOver<BlogPostVotes>() 
    .Where(blogPostVotes => blogPostVotes.BlogPostId == bp.Id) 
    .Where(blogPostVotes => blogPostVotes.UserId == currentUserId) 
    .Any()); 

Questo dovrebbe darvi il risultato che stai cercando. So che la mia sintassi funzionerà in LINQ to SQL, se non funziona per NHibernate, guarda questa risposta qui (Subqueries with QueryOver)