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 对象中。你为什么不直接编辑一个用户对象呢?然后 SubmitChanges() 将自动保存您的更新。IE

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 回答