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);
Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top