Linq具有更新查询

时间:2017-11-03 17:34:24

标签: c# linq

如何为linq编写这样的查询? 我最近开始学习linq,但仍然无法理解。

string update = @"UPDATE Users SET Score = Score + @score,
                               Bonus = Bonus + @bonus
                         WHERE Username = @username";
cmd = new SqlCommand(update, con);
cmd.Parameters.AddWithValue("@username", txtUsername.Text);
cmd.Parameters.AddWithValue("@score", txtScore.Text);
cmd.Parameters.AddWithValue("@bonus", txtBonus.Text);
con.Open();
cmd.ExecuteNonQuery();
XtraMessageBox.Show("Updated!");
con.Close();

我不会'知道为什么没有" Set" linq中的条款...... 顺便说一下,我正在使用实体框架

2 个答案:

答案 0 :(得分:0)

Linq(和实体框架)没有办法修改集合中的对象。您需要收集对象进行修改,修改,然后触发EF以将数据保存回数据库。

// get the objects you want to modify
var users = context.Users.Where(x => x.Username == myUsername);

foreach (var user in users)
{
    // change the properties
    user.Bonus += bonusToAdd;
    user.Score += scoreToAdd;
}

// EF will pick up those changes and save back to the database.
context.SaveChanges();

当然,Username很可能是主键,因此您不应该使用该名称拥有多条User条记录。只需将查询和foreach替换为:

var user = context.Users.Single(x => x.Username == myUsername);
user.Bonus += bonusToAdd;
user.Score += scoreToAdd;

如果您尝试查找不存在的用户,可以使用SingleOrDefault来帮助解决异常问题。

答案 1 :(得分:0)

Linq中未使用update关键字。您可以按如下方式执行更新:

var users = (from p in Context.Users
             where p.Username == username
             select p).ToList().ForEach(x =>
             {
                 x.Score += score;
                 x.Bonus += bonus;
             });
Context.SaveChanges();

或者,如果您不想使用lambda表达式,这将是相同的:

var users = (from p in Context.Users
             where p.Username == username
             select p).SingleOrDefault();

foreach (var user in users)
{
    user.Score += score;
    user.Bonus += bonus;
}           

Context.SaveChanges();