Linq to SQL - 选择新对象并执行更新

时间:2009-09-19 20:02:12

标签: c# linq-to-sql insert-update

我有一个选择数据到自定义类型的查询 -

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的建议非常好。

2 个答案:

答案 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();
        }
    }