C # método de aceptar un predicado - ¿Le resulta bien?
-
18-09-2019 - |
Pregunta
Me gustaría un método que tiene las siguientes API:
//get all users with a role of admin
var users = myRepository.GetUsers(u => u.Role == Role.Admin);
Will algo así como este trabajo?
IList<User> GetUsers(Func<User, bool> predicate)
{
var users = GetAllUsers();
return users.Where(predicate).ToList();
}
Si es así, yo wil ser capaz de especificar predicados más complejas, tales como ( pseudocódigo ):
myRepository.GetUsers(u => u.CreatedDate is upto 14 days old);
Solución
Eso se ve absolutamente bien. Sin embargo, si desea utilizar el predicado con algo como LINQ a SQL, que te gustaría usar:
IList<User> GetUsers(Expression<Func<User, bool>> predicate)
Esto significa que la expresión lambda se convertirá en un árbol de expresión en lugar de un delegado -. Y que a continuación árbol de expresión se puede convertir en SQL
Otros consejos
Sí, esto va a funcionar.
Lo que está diciendo es que el compilador que va a pasar una función que funciona en un objeto User
, y devuelve un bool
- lo que se ve como la función es totalmente de usted. Se puede conseguir la materia de anidación bastante compleja usando sales de rehidratación oral (||
) y ands (&&
) también, pero si se pone demasiado difícil ver lo que está haciendo el predicado, probablemente debería considerar refactorización.
Pero, básicamente, cualquier lambda que lleva, por ejemplo, como un objeto u
User
, y lo convierte en una expresión que devuelve bool
va a funcionar.
Un consejo:. Puede utilizar predicado