2009-08-21 17 views
5

Tengo dos métodos muy similares:¿Por qué mi declaración LINQ devuelve 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); 
} 

La de arriba, no se compilará, diciendo que devuelve IEnumerable en lugar de IQueryable.

¿Por qué es esto?

Además, soy consciente de que puedo agregar "AsQueryable()" al final y funcionará. ¿Qué diferencia hace eso? Cualquier golpe de rendimiento? Entiendo que IQueryable ha diferido la ejecución y tal, ¿todavía obtendré este beneficio?

Respuesta

17

Enumerable.Where toma Func<T, bool>.

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

Está llamando a Donde con un Func<T, bool>, por lo tanto, solo se aplica la llamada Enumerable.Where, y eso devuelve IEnumerable<T>.

cambiar su método a:

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

y debería estar bien. Básicamente, desea pasar un árbol de expresiones en lugar de un delegado, de modo que la expresión se pueda convertir a SQL.

+0

Un buen Sr. Skeet, gracias. – qui

Cuestiones relacionadas