簡體   English   中英

接受謂詞的C#方法 - 看起來好嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM