Ho cercato di saperne di più sull'utilizzo degli alberi di espressione Lamba e quindi ho creato un semplice esempio. Ecco il codice, funziona in LINQPad se incollato come programma C#.Utilizzo di alberi 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; }
}
Ne risulta il seguente errore:
Gli argomenti di tipo per il metodo 'System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func)' non può essere dedotto dall'uso. Prova a specificare esplicitamente gli argomenti del tipo.
Tuttavia, se mi basta sostituire la prima riga principale con questo:
IEnumerable<User> list = GetUsers().Where(u => u.Name.Contains("a"));
Funziona benissimo. Puoi dirmi cosa sto sbagliando, per favore?
Sì, è esattamente quello che ho fatto di sbagliato. Penso di aver ancora bisogno di fare più letture su questo argomento per cercare di capirlo meglio. L'altro mio esempio stava usando IQueryable e questo funzionava bene, quando ho creato un nuovo esempio usando un elenco IEnumerable non funzionava. Non sono sicuro di cosa significhi significare la parola chiave Expression. – Loathian
Il fatto che le espressioni lambda sono considerate come un delegato o un albero di espressioni dipende dal contesto. Nel codice, si dichiara il tipo restituito come espressione, e ciò indica al compilatore di considerare l'espressione lambda come un albero di espressioni, piuttosto che un delegato eseguibile. A proposito, espressione non è una parola chiave, è un tipo –
D'oh ... digitare non parola chiave. Grazie Thomas. – Loathian