2012-06-25 7 views
6

Sto giocando con RavenDb e mi chiedo se mi manca qualcosa di ovvio.Il passaggio della query ravendb come Func <T, bool> non funziona

La cosa è, che se sto passando query come questa:

var name = "test"; 
    posts = RavenSession.Query<Post>() 
     .Where(x => x.Tags.Any(y => y == name)) 
     .OrderByDescending(x => x.CreatedAt) 
     .Take(5); 

Funziona bene, se sto scrivendo equivalente (IMO) utilizzando Func<T, bool>, esso non va in crash, ma interrogazione manca dove condizione:

var name = "test";  
Func<Post, bool> selector = x => x.Tags.Any(y => y == name); 
posts = RavenSession.Query<Post>() 
     .Where(x => selector(x)) 
     .OrderByDescending(x => x.CreatedAt) 
     .Take(5); 

Profiler uscite esso come:

query = inizio = 0 pageSize = 5 aggregazione = Nessuno sorta = -CreatedAt

Aggiornamento: Funziona se sto usando l'espressione invece di Func, così ho pensato possa essere mi ricordo qualcosa di sbagliato su Func e LINQ, così ha scritto un semplice test:

var range = Enumerable.Range(1, 50); 

Func<int, bool> selector = x => x == 42; 
var filtered = range.Where(x => selector(x)); 

Quindi ora è solo una domanda perché Raven Db query builder si comporta in modo diverso.

risposta

9

Prova ad utilizzare un Expression invece:

Expression<Func<Post, bool>> selector = x => x.Tags.Any(y => y == name); 

e cambiare Where(x => selector(x))-Where(selector).

È necessario un codice Expression perché RavenDb può creare da esso un albero di espressioni che consente di convertire la logica in query di database. Non è possibile costruire un albero di espressioni da un Func<Post, bool>, quindi potrebbe ignorarlo, lanciare un'eccezione o qualsiasi altra cosa specificata dai creatori di RavenDb.

+0

Ho una domanda aggiornata, funziona con espressione. – Giedrius

+0

@Giedrius Ho aggiunto una breve spiegazione alla mia risposta. – Botz3000

3

Come risposta al vostro aggiornamento, c'è differenze comportamentali significative tra Func<> su IEnumerable<> e Expression<Func<>> su IQueryable<> che sembrano sintatticamente identico. Questo non è solo Raven, ma qualsiasi fonte IQueryable<> come LINQ a SQL o Entity Framework.

Problemi correlati