2012-09-25 59 views
2

因此,我在程序的某個部分立即更改了很多條目。 代碼現在看起來像這樣爲每個:批量更新數據庫的最快方法?

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+次,不是嗎?你會推薦什麼?

回答

3

我會用直ADO來做到這一點。我會得到用戶ID的列表,然後使用表值參數進行批量更新。

下面是從this MSDN文章示例:

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

第二種方法將再次加載所有的用戶,然後在「大規模更新」當你調用的SaveChanges所有用戶。它比第一個版本更高效,因爲它不發送300個選擇(只有一個更大的選擇)。

這是最好的你可以用原始的EF做沒有手動SQL。這樣的表現對你來說可能是好的。你可能應該測量需要多長時間並決定是否足夠。

如果您認爲速度不夠快,您需要使用原始SQL解決方案(該解決方案肯定已在網絡上的其他地方進行了描述)。

相關問題