我需要在表中为行子集设置一个值。在 SQL 中,我会这样做:
UPDATE dbo.Person SET is_default = 0 WHERE person_id = 5
有没有办法在 LINQ 中做到这一点?
我目前使用的是:
var result = (from p in Context.People....)
符号。
有我可以使用的更新方法吗?或者我是否必须获取所有记录,然后在 Foreach 中逐一更新它们?
如果可能的话,这是最有效的方法吗?
(from p in Context.person_account_portfolio where p.person_id == personId select p)
.ToList()
.ForEach(
x =>
x.is_default =
false);
这个效果最好。
(from p in Context.person_account_portfolio
where p.person_id == personId
select p)
.ToList() // This allows use of list methods
.ForEach(x => x.is_default = false); // Cycle through each item from query/in list and update its property 'is_default' with value 'false'
Context.SaveChanges();
我假设
person_id
是 Person
表的主键,所以以下是更新单个记录的方法:
Person result = (from p in Context.Persons
where p.person_id == 5
select p).SingleOrDefault();
result.is_default = false;
Context.SaveChanges();
以下是更新多条记录的方法:
List<Person> results = (from p in Context.Persons
where .... // add where condition here
select p).ToList();
foreach (Person p in results)
{
p.is_default = false;
}
Context.SaveChanges();
作为对已接受答案的补充,您可能会发现使用 LINQ 方法语法时代码看起来更加一致:
Context.person_account_portfolio
.Where(p => person_id == personId)
.ToList()
.ForEach(x => x.is_default = false);
.ToList()
是必需的,因为 .ForEach() 仅在 List<T>
上定义,而不是在 IEnumerable<T>
上定义。请注意,.ToList()
将在执行循环之前执行查询并从数据库加载所有匹配的行。
据我所知,你有两个选择:
SaveChanges()
。如果您使用选项 2,您将失去实体框架为您提供的一些抽象,但如果您需要执行非常大的更新,出于性能原因,这可能是最佳选择。
是的。可以使用foreach来更新linq中的记录。没有性能下降。
您可以验证标准 Where 运算符是使用 C# 2.0 中引入的 yield 构造实现的。
例如,yield 的使用有一个有趣的好处,即查询是 在迭代之前不会实际评估,或者使用 foreach 语句或手动使用底层 GetEnumerator 和 MoveNext 方法
var query = db.Customers.Where (c => c.Name.StartsWith ("A"));
query = query.Where (c => c.Purchases.Count() >= 2);
var result = query.Select (c => c.Name);
foreach (string name in result) // Only now is the query executed!
Console.WriteLine (name);
例外运算符有:首先,ElementAt、Sum、Average、All、Any、ToArray 和 ToList 强制立即查询评估。
因此无需害怕使用foreach
来获得
update
linq 结果。在您的情况下,下面给出的代码示例对于更新许多属性很有用,
var persons = (from p in Context.person_account_portfolio where p.person_name == personName select p);
//TO update using foreach
foreach(var person in persons)
{
//update property values
}
希望对您有帮助...
SaveChanges
。
foreach (var item in w)
{
if (Convert.ToInt32(e.CommandArgument) == item.ID)
{
item.Sort = 1;
}
else
{
item.Sort = null;
}
db.SubmitChanges();
}
public ActionResult OrderDel(int id)
{
string a = Session["UserSession"].ToString();
var s = (from test in ob.Order_Details where test.Email_ID_Fk == a && test.Order_ID == id select test).FirstOrDefault();
s.Status = "Order Cancel By User";
ob.SaveChanges();
//foreach(var updter in s)
//{
// updter.Status = "Order Cancel By User";
//}
return Json("Sucess", JsonRequestBehavior.AllowGet);
} <script>
function Cancel(id) {
if (confirm("Are your sure ? Want to Cancel?")) {
$.ajax({
type: 'POST',
url: '@Url.Action("OrderDel", "Home")/' + id,
datatype: 'JSON',
success: function (Result) {
if (Result == "Sucess")
{
alert("Your Order has been Canceled..");
window.location.reload();
}
},
error: function (Msgerror) {
alert(Msgerror.responseText);
}
})
}
}
</script>