C# Método Aceitando um predicado - isso parece ok?
-
18-09-2019 - |
Pergunta
Queria um método que tenha a seguinte API:
//get all users with a role of admin
var users = myRepository.GetUsers(u => u.Role == Role.Admin);
Será que algo assim funcionará?
IList<User> GetUsers(Func<User, bool> predicate)
{
var users = GetAllUsers();
return users.Where(predicate).ToList();
}
Nesse caso, eu posso especificar predicados mais complexos, como (pseudo-código):
myRepository.GetUsers(u => u.CreatedDate is upto 14 days old);
Solução
Isso parece absolutamente bom. No entanto, se você deseja usar o predicado com algo como LINQ para SQL, deseja usar:
IList<User> GetUsers(Expression<Func<User, bool>> predicate)
Isso significa que a expressão de lambda será convertida em uma árvore de expressão em vez de um delegado - e essa árvore de expressão pode ser convertida em SQL.
Outras dicas
Sim, isso vai funcionar.
O que você está dizendo ao compilador é que você passará uma função que funciona em um User
objeto, e retorna um bool
- O que a função parece depende de você. Você pode obter coisas de ninho bastante complexas usando ORS (||
) e ands (&&
) também, mas se for muito difícil ver o que o predicado está fazendo, você provavelmente deve considerar a refatoração.
Mas basicamente qualquer lambda que tome, por exemplo u
como um User
objeto e transforma -o em uma expressão que retorna bool
vai funcionar.
Uma dica: você pode usar o predicadou003CT> em vez de funcu003CT, bool> , que é um pouco mais claro (predicadou003CT> é incorporado para .NET 3.5, sistema de namespace).