Question

Je voudrais une méthode qui a l'API suivante:

//get all users with a role of admin
var users = myRepository.GetUsers(u => u.Role == Role.Admin);

est quelque chose comme ce travail?

IList<User> GetUsers(Func<User, bool> predicate)
{            
  var users = GetAllUsers();
  return users.Where(predicate).ToList();                                                          
} 

Si oui, je wil être en mesure de préciser les prédicats plus complexes tels que ( pseudocode ):

myRepository.GetUsers(u => u.CreatedDate is upto 14 days old);
Était-ce utile?

La solution

Cela semble tout à fait bien. Toutefois, si vous souhaitez utiliser le prédicat avec quelque chose comme LINQ to SQL, vous voulez utiliser:

IList<User> GetUsers(Expression<Func<User, bool>> predicate)

Cela signifie que l'expression lambda sera converti en un arbre d'expression au lieu d'un délégué -. Et cet arbre d'expression peut ensuite être converti en SQL

Autres conseils

Oui, cela fonctionnera.

Ce que vous dites le compilateur est que vous allez passer une fonction qui fonctionne sur un objet User, et retourne un bool - ce que la fonction ressemble est entièrement à vous. Vous pouvez obtenir des trucs de nidification assez complexe en utilisant ORS (||) et (ANDS) && aussi, mais si elle est trop difficile de voir ce que le prédicat fait, vous devriez probablement envisager refactoring.

Mais en fait tout lambda qui prend par exemple u comme objet User, et le transforme en une expression qui retourne bool fonctionnera.

Une astuce:. Vous pouvez utiliser prédicats au lieu de Func , qui est un peu plus claire (prédicats est construit dans .NET 3.5, espace de noms System)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top