2010-06-02 14 views
7

Ho appena iniziato con NHibernate e ho problemi con l'esecuzione di query più complesse.NHibernate: QueryOver <> help

Sono entità con allegato un elenco di tag. L'utente fornirà due elenchi di tag, includi ed escludi.

Devo trovare tutte le entità che hanno tutti i tag di inclusione ed escludere qualsiasi entit che abbia qualsiasi tag nell'elenco di esclusione.

Di seguito è riportato il mio primo tentativo, che è chiaramente errato in quanto elenca tutti gli oggetti di visualizzazione che hanno uno dei tag include piuttosto che tutti!

Qualsiasi assistenza è molto apprezzata.

var includeTagIds = (from tag in regime.IncludeTags select tag.Id).ToList<int>(); 
var excludeTagIds = from tag in regime.ExcludeTags select tag.Id; 


var displays = session.QueryOver<Display>() 
         .JoinQueryOver<DisplayTag>(display => display.Tags) 
         .WhereRestrictionOn(tag => tag.Id) 
         .IsIn(includeTagIds).List().Distinct(); 


return displays.ToList(); 

risposta

14

Quella query non è banale (pensa a come potresti farlo usando l'SQL raw). Penso che quanto segue funzionerà (richiedendo due sottoquery correlate):


Display displayAlias = null; 

var countIncludedTagsSubquery = 
    QueryOver.Of<Display>() 
     .Where(d => d.Id == displayAlias.Id) 
     .JoinQueryOver<DisplayTag>(d => d.Tags) 
      .WhereRestrictionOn(t => t.Id).IsInG(includedTagIds) 
      .Select(Projections.RowCount()); 

var excludedTagsSubquery = 
    QueryOver.Of<Display>() 
     .Where(d => d.Id == displayAlias.Id) 
     .JoinQueryOver<DisplayTag>(d => d.Tags) 
      .WhereRestrictionOn(t => t.Id).IsInG(excludedTagIds) 
      .Select(t => t.Id); 

var displays = 
    session.QueryOver<Display>(() => displayAlias) 
     .WithSubquery.WhereValue(includedTagIds.Count).Eq(countIncludedTagsSubquery) 
     .WithSubquery.WhereNotExists(excludedTagsSubquery) 
     .List(); 
+6

Grazie per il vostro aiuto, farò un tentativo. Sto scoprendo che molti degli esempi non sono abbastanza complessi per le applicazioni del mondo reale. Grazie ancora –

Problemi correlati