0

カスタムタイプにデータを選択するクエリがあります-

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 の提案は優れています。

4

2 に答える 2

1

これ以上の文脈がなければ、あなたの意図は明確ではありません。UserオブジェクトからUserDataオブジェクトにユーザー属性をコピーしています。Userオブジェクトを編集してみませんか?次に、SubmitChanges()は自動的に更新を保持します。すなわち

User curData = dc.Users.Where(λ => (λ.Login == username) && λ.Active)
于 2009-09-19T20:10:18.223 に答える
0

簡単な例を次に示します。

    using(DbContext dbContext = new DbContext())
    {
        UserData curData = dc.Users.Where(λ => (λ.Login == username) && λ.Active).SingleOrDefault(); // You need(!) to use SingleOrDefault or FirstOrDefault
        if(curData != null) 
        {
            curData.LastIP = 'xx.xx.xx.xx';
            curData.LastVisit = DateTime.Now;
            dbContext.SaveChanges();
        }
    }
于 2012-10-10T07:12:51.543 に答える