接受谓词的C#方法 - 看起来好吗?

时间:2010-02-05 11:43:10

标签: c# linq lambda func predicates

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

3 个答案:

答案 0 :(得分:19)

看起来非常好。但是,如果要将谓词与LINQ to SQL一起使用,则需要使用:

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

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

答案 1 :(得分:3)

是的,这会有用。

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

但基本上任何以uUser对象的lambda,并将其转换为返回bool的表达式都可以。

答案 2 :(得分:2)

一个提示:您可以使用Predicate&lt; T&gt;而不是Func&lt; T,bool&gt;,这是一个更清晰的(Predicate&lt; T&gt;内置于.net 3.5,命名空间系统)。