He estado tratando de aprender más sobre el uso de árboles de expresión de Lamba, así que creé un ejemplo simple. Aquí está el código, esto funciona en LINQPad si está pegado como un programa C#.Usando árboles Lambda Expressions con IEnumerable
void Main()
{
IEnumerable<User> list = GetUsers().Where(NameContains("a"));
list.Dump("Users");
}
// Methods
public IEnumerable<User> GetUsers()
{
yield return new User{Name = "andrew"};
yield return new User{Name = "rob"};
yield return new User{Name = "chris"};
yield return new User{Name = "ryan"};
}
public Expression<Func<User, bool>> NameContains(string namePart)
{
return u => u.Name.Contains(namePart);
}
// Classes
public class User
{
public string Name { get; set; }
}
Esto da como resultado el siguiente error:
Los argumentos de tipo para el método de 'System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func)' no puede deducirse del uso. Intente especificar los argumentos de tipo explícitamente.
Sin embargo si simplemente sustituya la primera línea principal con este:
IEnumerable<User> list = GetUsers().Where(u => u.Name.Contains("a"));
Trabaja muy bien. Me puede decir lo que estoy haciendo mal, por favor?
Sí, eso es exactamente lo que hice mal. Creo que todavía necesito leer más sobre este tema para tratar de entenderlo mejor. Mi otro ejemplo estaba usando IQueryable y esto estaba funcionando bien, cuando construí un nuevo ejemplo usando una lista IEnumerable, no funcionaría. No estoy seguro de qué significa la palabra clave Expression. – Loathian
El hecho de que las expresiones lambda se consideren como un delegado o un árbol de expresiones depende del contexto. En su código, declara el tipo de devolución como Expresión, y esto le dice al compilador que considere la expresión lambda como un árbol de expresiones, en lugar de un delegado ejecutable. Por cierto, Expression no es una palabra clave, es un tipo –
D'oh ... escribe no palabra clave. Gracias Thomas. – Loathian