すでに作成した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
を取得できます。
すでに作成されたユーザーインスタンスを渡す必要がありますか?あるいは 'x => new User(){Name =" Jack "}'のような更新ファクトリを渡すことができますか? –
はい。前に作成したUserのインスタンスを渡します。 – hanc
'User'クラスは' Name'以外のプロパティを持っていますか?もしそうなら、 'Update'メソッドは他のプロパティも更新すべきですか?例えば、 'Age'プロパティがあるとします。これも更新する必要がありますか? 'Update'メソッドは、更新するプロパティをどのように知っていますか? –