2016-07-26 10 views
3

この関数の汎用メソッドを作成し、パラメータのようなユーザークラスとwhere句を送信したいと考えています。.net汎用メソッドIterable <T>と式<Func<T, T>>

public void Update(where clause, User user) {} 

しかし、私は正しい方法を見つけることができません。

ctx.Users.Where(x => x.Id == 10) 
     .Update(x => new User() { Name = "Jack" }); 

メソッドの宣言は次のとおりです。

public static int Update<T>(this IQueryable<T> query, Expression<Func<T, T>> updateFactory) where T : class; 
+0

すでに作成されたユーザーインスタンスを渡す必要がありますか?あるいは 'x => new User(){Name =" Jack "}'のような更新ファクトリを渡すことができますか? –

+0

はい。前に作成したUserのインスタンスを渡します。 – hanc

+0

'User'クラスは' Name'以外のプロパティを持っていますか?もしそうなら、 'Update'メソッドは他のプロパティも更新すべきですか?例えば、 'Age'プロパティがあるとします。これも更新する必要がありますか? 'Update'メソッドは、更新するプロパティをどのように知っていますか? –

答えて

0

すでに作成したUserインスタンスを渡すと、それはそれらのすべてを更新する必要があり、Update方法は、例えば(更新するプロパティを知ることができるのではないでしょうか?または、デフォルト以外の値を持つもの、意図的にプロパティをデフォルト値に設定した場合はどうなりますか?)

メンバー初期化式を含む式Expression<Func<T, T>>を渡す必要があります。 x => new User() { Name = "Jack" }

式はコードとしてのデータです。内部的には、フレームワークは式を解析し、更新される予定のプロパティを確認します。この例の場合、Nameプロパティのみが更新されることがわかります。

where式については、Expression<Func<User,bool>>を渡す必要があります。

public void Update(
    Expression<Func<User,bool>> condition, 
    Expression<Func<User,User>> updateFactory) 
{ 
    ctx.Users 
     .Where(condition) 
     .Update(updateFactory); 
} 

をそして、あなたはこのようにそれを使用することができます:だからあなたのメソッドは次のようになり

Update(x => x.Id == 10, x => new User() { Name = "Jack" }); 

EDIT:

あなたが更新するプロパティを見つけるための方法を持っている場合は、次のような式を作成できます。

public static void Update(
    Expression<Func<User, bool>> condition, 
    User user, 
    PropertyInfo[] propertiesToUpdate) 
{ 
    Expression<Func<User, User>> updateFactory = 
     Expression.Lambda<Func<User, User>>(
      Expression.MemberInit(
       Expression.New(typeof (User)), 
       propertiesToUpdate 
        .Select(prop => 
         Expression.Bind(
          prop.SetMethod, 
          Expression.Constant(prop.GetValue(user))))), 
      Expression.Parameter(typeof(User), "u")); 

    ctx.Users 
     .Where(condition) 
     .Update(updateFactory); 
} 

Ifプロパティ名のみがある場合はType.GetPropertyメソッドを使用して対応するPropertyInfoを取得できます。

+0

私はオブジェクトのみユーザーを渡し、私は行うことができますどのように表現を生成するための機能を使いたい場合は?プロパティが以下のように設定されているかどうかを確認したい: 'var entry = _Context.Entry(entity); foreachの(entry.OriginalValues.PropertyNamesにおけるVARプロパティ) {VAR原= entry.OriginalValues.GetValue (プロパティ)。 var current = entry.CurrentValues.GetValue (プロパティ); if(original!= null &&!original.Equals(current)) {---プロパティの変更は式 に添付します。 } – hanc

+0

私は自分の答えを更新しました。更新するプロパティを取得できる場合は、自分で式を作成できます。 –

関連する問題