カスタムタイプにデータを選択するクエリがあります-
UserData curData = dc.Users.Where(λ => (λ.Login == username) && λ.Active)
.Select( λ => new UserData { ID = λ.ID, UserName = λ.Login, isAdmin = λ.Admin, isTrusted = λ.Trusted, EMail = λ.E_mail ... });
//Yeah I know this isn't a technically correct usage of 'λ'
//It is just a convenient variable name. Please don't hit me.
ユーザーの情報を取得したら、「LastIP」や「LastVisit」などの情報を更新し、パスワードが正しく、ログインが成功した場合に変更を送信できるようにしたいと考えています。
私が正しく理解している場合、新しいオブジェクトは切り離されているため、変更して dc.SubmitChanges() を呼び出しても、変更は保存されません。この状況で更新を実行する最良の方法は何ですか。別の選択を行い、そこでデータを変更する必要がありますか?最初のステートメントでインライン化する方法はありますか?
助けてくれてありがとう!
私はこれをまとめて、他の誰かがインラインソリューションを必要とする場合に備えて投稿すると考えました-
internal static class auth_extensions
{
public static IQueryable<User> Update(this IQueryable<User> data, Action<User> updateDelegate)
{
foreach (User cur in data)
{
updateDelegate(cur);
}
return data;
}
}
}
アセンブリの拡張メソッドを使用すると、クエリは次のようになります。
UserData curData = dc.Users
.Where(λ => (λ.Login == username) && λ.Active)
.Update(λ => {
λ.LastIP = HttpContext.Current.Request.UserHostAddress;
λ.lastVisit = DateTime.Now;
})
.Select(loadDelegate).SingleOrDefault();
そうは言っても、cdonner の提案は優れています。