9

我想要一个具有以下 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();                                                          
} 

如果是这样,我能否指定更复杂的谓词,例如(伪代码):

myRepository.GetUsers(u => u.CreatedDate is upto 14 days old);
4

3 回答 3

20

这看起来绝对没问题。但是,如果您想将谓词与 LINQ to SQL 之类的东西一起使用,则需要使用:

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

这意味着 lambda 表达式将被转换为表达式树而不是委托 - 然后该表达式树可以转换为 SQL。

于 2010-02-05T11:46:53.363 回答
3

是的,这会起作用。

您要告诉编译器的是,您将传递一个适用于User对象的函数,并返回 a bool- 函数的外观完全取决于您。您也可以使用 ors ( ||) 和 ands ( &&) 获得非常复杂的嵌套内容,但是如果很难看到谓词在做什么,您可能应该考虑重构。

但基本上任何将例如u作为User对象并将其转换为返回表达式的 lambda 表达式bool都可以工作。

于 2010-02-05T11:44:54.417 回答
2

一个提示:您可以使用 Predicate<T> 代替 Func<T, bool>,这样更清晰一些(Predicate<T> 内置于 .net 3.5,命名空间系统)。

于 2010-02-05T11:47:26.077 回答