簡體   English   中英

實體框架 6 在一個事務中批量更新/刪除的位置

[英]Entity Framework 6 Where in Bulk Update/Delete in one transaction

在 EF6 中,我想在一個查詢中更新/刪除批量數據。 我的代碼是

 using (var context = _dataContextFactory.GetContext())
            {
                var result1 = from b in context.MyTables
                    where new List<int> {592, 593, 594}.Contains(b.Id)
                    select b;


                foreach (var item in result1 )
                {
                    item.StatusId = 3;
                }

                context.SaveChanges();

            }

但是在Sql Profiler中,有3個腳本

exec sp_executesql N'UPDATE [dbo].[MyTable] SET [StatusId] = @0 WHERE ([Id] = @1) ',N'@0 int,@1 int',@0=1,@1=592
exec sp_executesql N'UPDATE [dbo].[MyTable] SET [StatusId] = @0 WHERE ([Id] = @1) ',N'@0 int,@1 int',@0=1,@1=593
exec sp_executesql N'UPDATE [dbo].[MyTable] SET [StatusId] = @0 WHERE ([Id] = @1) ',N'@0 int,@1 int',@0=1,@1=594

是否可以在一個查詢中使用 Where In 子句獲取腳本?

不幸的是,開箱即用的實體框架不支持此功能。 但是,您可以使用EntityFramework.Extended庫中的批量更新功能:

https://github.com/loresoft/EntityFramework.Extended

還有一個 nuget 包可用。

一個例子是:

using EntityFramework.Extensions;

...

int[] myIds = { 592, 593, 594 };

using (var context = _dataContextFactory.GetContext())
{
    // Define a filter expression to retrieve matching items
    var filter = context.MyTables.Where(item => myIds.Contains(item.Id));
    // Update the StatusId of matched items
    context.MyTables.Update(filter, i => new Item { StatusId = 3 });

    // NB: no context.SaveChanges() required
}

注意:可能有更有效的編寫方式,但我仍在使用庫。 但是,它確實可以編譯為單個 SQL 語句,並且該庫還包括批處理 DELETE。

最后,不要擔心new表達式。 此處未引用的任何屬性將保留其原始值。

您無法使用 EF 在一次 SQL 調用中更新多行。

相反,您可以做的是編寫一個可以為您高效完成工作的存儲過程。 或者使用為 EF 提供擴展的第三方庫來執行此操作。

當然,如果要更新的行數真的很少,那就沒有意義了。

基於@Dave R.答案的最新 Z.EntityFramework.Plus (v5.1.16) 示例代碼。 此外, .Where.Update可以放在一個語句中:

using Z.EntityFramework.Plus;

...

int[] myIds = { 592, 593, 594 };

using (var context = _dataContextFactory.GetContext())
{
    context.MyTables
        .Where(item => myIds.Contains(item.Id))
        .Update(i => new Item { StatusId = 3 });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM