2009-08-21 4 views
5

J'ai deux méthodes très similaires:Pourquoi mon instruction LINQ renvoie-t-elle 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); 
} 

Celle du haut, ne compilera pas, en disant qu'il retourne IEnumerable plutôt que IQueryable.

Pourquoi est-ce?

Aussi, je suis conscient que je peux ajouter "AsQueryable()" à la fin et cela fonctionnera. Quelle différence cela fait-il cependant? Des hits de performance? Je comprends que IQueryable a différé l'exécution et tel, vais-je toujours obtenir cet avantage?

Répondre

17

Enumerable.Where prend Func<T, bool>.

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

Vous appelez Où avec un Func<T, bool>, seul l'appel Enumerable.Where est applicable et renvoie IEnumerable<T>.

Changer votre méthode:

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

et il devrait être correct. Fondamentalement, vous voulez passer dans un arbre d'expression au lieu d'un délégué, de sorte que l'expression peut être convertie en SQL.

+0

Un bon M. Skeet, merci. – qui

Questions connexes