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)

つまり、ラムダ式はデリゲートではなく式ツリーに変換され、その式ツリーは SQL に変換できます。

于 2010-02-05T11:46:53.363 に答える
3

はい、これでうまくいきます。

あなたがコンパイラに伝えているのは、Userオブジェクトで動作する関数を渡して a を返すというboolことです。関数がどのように見えるかは完全にあなた次第です。||ors ( ) と ands ( )を使用してかなり複雑な入れ子を取得することもできますが&&、述語が何をしているのかを理解するのが難しすぎる場合は、おそらくリファクタリングを検討する必要があります。

ただし、基本的に、たとえばオブジェクトuとして受け取りUser、それを返す式に変換するラムダboolは機能します。

于 2010-02-05T11:44:54.417 に答える
2

1 つのヒント: Func<T, bool> の代わりに Predicate<T> を使用できます。これは少し明確です (Predicate<T> は .net 3.5 の名前空間システムに組み込まれています)。

于 2010-02-05T11:47:26.077 に答える