C# 大规模更新数据库的最快方法?

C# 大规模更新数据库的最快方法?,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,因此,我在程序的某个部分一次更改了很多条目。 对于每一个,现在的代码如下所示: foreach(newentry) { oldentry = context.Users.Find(entry.userid); newentry.oldvalue = newvalue; context.Entry(oldentry).CurrentValues.SetValues(newentry); } context.SaveChanges(); 然而,这最终导致对数据库的查询超过3

因此,我在程序的某个部分一次更改了很多条目。 对于每一个,现在的代码如下所示:

foreach(newentry)
{
    oldentry = context.Users.Find(entry.userid);
    newentry.oldvalue = newvalue;
    context.Entry(oldentry).CurrentValues.SetValues(newentry);
}
context.SaveChanges();
然而,这最终导致对数据库的查询超过300次,并降低了我的性能。 我想到的唯一方法是预加载数据库,但我认为这也不是最好的方法

var userlist = context.Users.ToList();
foreach(newentry in userlist)
{
    var original = entry;
    entry.originalvalue = newvalue;
    context.Entry(original).CurrentValues.SetValues(newentry);
}
context.SaveChanges();

我还在访问数据库300多次,不是吗?你有什么建议吗?

我会用直接的ADO来做。我将获得用户ID列表,然后使用表值参数进行大规模更新

以下是MSDN文章中的一个示例:

UPDATE dbo.Categories
SET Categories.CategoryName = ec.CategoryName
FROM dbo.Categories INNER JOIN @tvpEditedCategories AS ec
ON dbo.Categories.CategoryID = ec.CategoryID;

第二种方法将加载所有用户,然后在调用SaveChanges时“批量更新”所有用户。它比第一个版本要高效得多,因为它不发送300个选择(只发送一个更大的选择)

这是在没有手动SQL的情况下使用原始EF所能做到的最好的方法。这样的性能对您来说可能还可以。你可能应该测量它需要多长时间,并决定它是否足够

如果您认为它不够快,那么您需要求助于原始SQL解决方案(web上的其他地方肯定已经描述过)