2009-08-21 13 views
5

Ho due metodi molto simili:Perché la mia istruzione LINQ restituisce IEnumerable?

public IQueryable<User> Find(Func<User, bool> exp) 
{ 
    return db.Users.Where(exp); 
} 

public IQueryable<User> All() 
{ 
    return db.Users.Where(x => !x.deleted); 
} 

Quello superiore, non si compila, dicendo restituisce IEnumerable piuttosto che IQueryable.

Perché è questo?

Inoltre, sono consapevole di poter aggiungere "AsQueryable()" alla fine e funzionerà. Che differenza fa però? Qualche hit sulle prestazioni? Comprendo che IQueryable ha un'esecuzione posticipata e, ad esempio, otterrò comunque questo vantaggio?

risposta

17

Enumerable.Where prende Func<T, bool>.

Queryable.Where prende Expression<Func<T, bool>>.

Si sta chiamando Dove con un Func<T, bool>, pertanto è applicabile solo la chiamata Enumerable.Where e restituisce IEnumerable<T>.

cambiare il metodo di:

public IQueryable<User> Find(Expression<Func<User, bool>> exp) 
{ 
    return db.Users.Where(exp); 
} 

e dovrebbe essere a posto. In pratica, si desidera passare in un albero di espressioni anziché in un delegato, in modo che l'espressione possa essere convertita in SQL.

+0

Bello, signor Skeet, grazie. – qui

Problemi correlati