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

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 en lugar de Func , que es un poco más claro (predicado está integrado en .NET 3.5, namespace System)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top