我需要在表中为行子集设置一个值。在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);
答案 0 :(得分:50)
我认为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();
答案 1 :(得分:48)
这效果最佳。
(from p in Context.person_account_portfolio
where p.person_id == personId select p).ToList()
.ForEach(x => x.is_default = false);
Context.SaveChanges();
答案 2 :(得分:9)
作为对已接受答案的补充,您可能会发现在使用LINQ方法语法时代码看起来更加一致:
Context.person_account_portfolio
.Where(p => person_id == personId)
.ToList()
.ForEach(x => x.is_default = false);
.ToList()
是必要的,因为.ForEach()仅在List<T>
上定义,而不在IEnumerable<T>
上定义。请注意.ToList()
将执行查询并在执行循环之前从数据库加载所有匹配的行。
答案 3 :(得分:6)
据我所知,你有两个选择:
SaveChanges()
。如果使用选项2,则会丢失实体框架为您提供的一些抽象,但如果您需要执行非常大的更新,这可能是出于性能原因的最佳选择。
答案 4 :(得分:3)
<强> 是。您可以使用foreach更新linq中的记录。没有性能下降。
您可以验证使用C#2.0中引入的Where结构实现标准yield运算符。
查询所在的use of yield has an interesting benefit 实际上没有评估,直到它被迭代,或者用a 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
}
我希望它有所帮助...
答案 5 :(得分:2)
是的,您必须获取所有记录,更新它们,然后致电SaveChanges
。
答案 6 :(得分:1)
奇怪的是,对我而言,它是SubmitChanges而不是SaveChanges:
foreach (var item in w)
{
if (Convert.ToInt32(e.CommandArgument) == item.ID)
{
item.Sort = 1;
}
else
{
item.Sort = null;
}
db.SubmitChanges();
}
答案 7 :(得分:0)
为了回应上面对答案的评论,这是我的解决方案,它使用了一个没有中断或抽象的 Linq 查询,但它避免了不必要地使用列表和 ForEach 的内存和计算......< /p>
(from p in Context.person_account_portfolio
where p.personId == personId
select p).FirstOrDefault().is_default .Equals(false);
答案 8 :(得分:-1)
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>