Pages

2015-07-15

EF的多筆批次修改及刪除

EF v6.1.3對於執行多筆批次修改的SQL命令(UPDATE Table1 SET ItemType=2 WHERE ItemId > 5),還是得一筆一筆執行,網上很多套Update Extensions可供使用,比較有名的就是「EntityFramework.Extended」:

PM> Install-Package EntityFramework.Extended

在多筆修改部分,它使用INNER JOIN方式來綁定ID修改欄位,雖然不及原生SQL語法簡潔,但還能接受,而且它能強制更新指定欄位,比起用EF內建的Attach(entity)方式更方便,強制更新指定欄位,不需再注意Old/New Values差異可能造成的BUG地雷,。
using EntityFramework.Extensions;

var listId = new List { 1, 2, 3 };
dbContext.Entries.Where(x => listId.Contains(oldEntry.LogId)).Update(
expr => new CMS_Log {
LogType = "123",
LogLevel = 0
}
);
dbContext.SaveChanges();

SQL Update


在多筆刪除部分,EF v6已支援內建RemoveRange(entities)來多筆刪除,也可以使用外掛的Extension Update()更是簡潔。

using EntityFramework.Extensions;

dbContext.Entries
.Where(x => x.LogId > 15 && x.LogId < 20)
.Delete();
dbContext.SaveChanges();

SQL Delete


外掛Extension函式產生的SQL都有點冗長,但在不使用原生SQL Text下,就將就用吧! 總比起EF得下N筆SQL指令的方式更具高效率了。此外,EF BulkInsert大量新增操作的效能提升,又是另一話題了。

No comments: