Я хотел бы метод, который имеет следующий API:
//get all users with a role of admin
var users = myRepository.GetUsers(u => u.Role == Role.Admin);
Что-то вроде этого будет работать?
IList<User> GetUsers(Func<User, bool> predicate)
{
var users = GetAllUsers();
return users.Where(predicate).ToList();
}
Если так, wil я смочь указать более сложные предикаты, такие как (псевдокод):
myRepository.GetUsers(u => u.CreatedDate is upto 14 days old);
Выглядит абсолютно нормально. Однако, если вы хотите использовать предикат с чем-то вроде LINQ to SQL, вы должны использовать:
IList<User> GetUsers(Expression<Func<User, bool>> predicate)
Это означает, что лямбда-выражение будет преобразовано в дерево выражения вместо делегата - и это дерево выражения затем может быть преобразован в SQL.
Да, это сработает.
Вы говорите компилятору, что вы собираетесь передать функцию, которая работает с объектом User
и возвращает bool
- функция выглядит так: полностью зависит от вас. Вы можете получить довольно сложные элементы вложенности, используя ors ( ||
) и ands ( &&
), но если становится слишком сложно увидеть, что делает предикат, вам, вероятно, следует подумать рефакторинг.
Но в основном любая лямбда, которая принимает, например, u
как объект User
и превращает его в выражение, возвращающее bool
, будет работать.
Один совет: вы можете использовать Predicate