[英]C# method accepting a predicate - does this look ok?
我想要一個具有以下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);
看起來絕對沒問題。 但是,如果要將謂詞與LINQ to SQL一起使用,則需要使用:
IList<User> GetUsers(Expression<Func<User, bool>> predicate)
這意味着lambda表達式將轉換為表達式樹而不是委托 - 然后表達式樹可以轉換為SQL。
是的,這會奏效。
你告訴編譯器的是你要傳遞一個在User
對象上運行的函數,並返回一個bool
- 函數看起來完全取決於你。 你可以使用ors( ||
)和ands( &&
)來獲得相當復雜的嵌套內容,但是如果它太難以看到謂詞正在做什么,你應該考慮重構。
但基本上任何lambda,例如u
作為User
對象,並將其轉換為返回bool
的表達式將起作用。
一個提示:您可以使用Predicate <T>而不是Func <T,bool>,這有點清晰(Predicate <T>內置於.net 3.5,命名空間系統)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.