如何为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中的条款...... 顺便说一下,我正在使用实体框架
答案 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();