从ID列表更新Entity Framework中的多行


94

我正在尝试为实体框架创建一个查询,该查询将允许我获取ID列表并更新与它们关联的字段。

SQL中的示例:

UPDATE Friends
SET msgSentBy = '1234'
WHERE id IN (1, 2, 3, 4)

如何将以上内容转换为实体框架?


您的数据库平台是什么Oracle mysql ..
zee 2014年

我的数据库是Microsoft SQL
14年

有两个允许这样做的开源项目:EntityFramework.Extended和E ntity Framework Extensions
彼得·克尔

Answers:


165

像下面这样

var idList=new int[]{1, 2, 3, 4};
using (var db=new SomeDatabaseContext())
{
    var friends= db.Friends.Where(f=>idList.Contains(f.ID)).ToList();
    friends.ForEach(a=>a.msgSentBy='1234');
    db.SaveChanges();
}

更新:

您可以如下更新多个字段

friends.ForEach(a =>
                      {
                         a.property1 = value1;
                         a.property2 = value2;
                      });

我可以在上面刚刚发送的foreach中更新多个字段吗,这正是我所要求的。只是好奇是否可以做更多?看起来也不像SubmitChanges一样有效。我正在使用最新的实体框架。也许SaveChanges()?
allencode

10
ForEach是上的一种方法List,通常不建议使用,因为它不是一种非常实用的编程方式。像普通人一样使用foreach (操作员)即可
BlueRaja-Danny Pflughoeft 2015年

55
使用此解决方案将为列表中的每个元素生成一个更新查询。有没有办法让EF像问题中那样只执行一个查询?(UPDATE SomeTable SET SomeField = SomeValue WHERE Id IN (...)
RamNow 2015年

19
请注意,从数据库角度来看,这是一种效率很低的方法。这不仅会发出一个大的select语句,涉及到Friends表中的每一行,而且还会为每个更新的记录发出单独的UPDATE命令。因此,与其发出一个命令,不如发出许多命令以及从数据库中流式传输大量数据。
d512'2

1
@ShekharPankaj,基本上,您要做的就是发出一个SQL命令,例如“ UPDATE Friends SET msgSentBy ='1234'WHERE ID IN(1、2、3、4)。我认为EF没有这样做的直接支持。我相信对此有一些第三方解决方案(stackoverflow.com/questions/12751258/batch-update-delete-ef5),但我还没有使用它们。其他选项是使用原始ADO.NET而不是EF。
d512

0
var idList=new int[]{1, 2, 3, 4};
var friendsToUpdate = await Context.Friends.Where(f => 
    idList.Contains(f.Id).ToListAsync();

foreach(var item in previousEReceipts)
{
  item.msgSentBy = "1234";
}

您可以使用foreach更新满足您条件的每个元素。

这是更通用的示例:

var itemsToUpdate = await Context.friends.Where(f => f.Id == <someCondition>).ToListAsync();

foreach(var item in itemsToUpdate)
{
   item.property = updatedValue;
}
Context.SaveChanges()

通常,您最有可能在adb查询中使用await方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.