我想要一个具有以下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);
答案 0 :(得分:19)
看起来非常好。但是,如果要将谓词与LINQ to SQL一起使用,则需要使用:
IList<User> GetUsers(Expression<Func<User, bool>> predicate)
这意味着lambda表达式将转换为表达式树而不是委托 - 然后表达式树可以转换为SQL。
答案 1 :(得分:3)
是的,这会有用。
你告诉编译器的是你要传递一个适用于User
对象的函数,并返回一个bool
- 函数看起来完全取决于你。使用ors(||
)和ands(&&
)也可以获得非常复杂的嵌套内容,但是如果很难看到谓词在做什么,你应该考虑重构。
但基本上任何以u
为User
对象的lambda,并将其转换为返回bool
的表达式都可以。
答案 2 :(得分:2)
一个提示:您可以使用Predicate&lt; T&gt;而不是Func&lt; T,bool&gt;,这是一个更清晰的(Predicate&lt; T&gt;内置于.net 3.5,命名空间系统)。