我有一个选择数据到自定义类型的查询 -
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的建议非常好。
答案 0 :(得分:1)
没有更多背景,你的意图不明确。您正在将用户属性从User对象复制到UserData对象。为什么不编辑User对象?然后SubmitChanges()将自动保留您的更新。即。
User curData = dc.Users.Where(λ => (λ.Login == username) && λ.Active)
答案 1 :(得分: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();
}
}