EF CORE 7 中的新功能:使用 ExecuteDelete 和 ExecuteUpdate 進行批量操作

原文鏈接:https://timdeschryver.dev/blog/new-in-entity-framework-7-bulk-operations-with-executedelete-and-executeupdate

原文作者:tim_deschryver

翻譯:沙漠盡頭的狼(谷歌翻譯加持)

Entity Framework 7 包括一些已被要求的流行功能,其中之一是批量操作。Julie Lerman 的一條推文[1]引起了我的注意,我不得不親自嘗試一下。

推文地址:https://twitter.com/julielerman/status/1557743067691569156[2]

07ffb0f03b8dec1af9a74534f95966ea.png
https://twitter.com/julielerman/status/1557743067691569156

為什么?

那么,如果我們已經可以更新和刪除實體,為什么還需要這個功能呢?這里的關鍵詞是性能。這是一個在 EF 新版本中一直位居榜首的主題,這次也不例外。

添加的方法以多種方式提高了性能。而不是首先檢索實體并將所有實體存儲在內存中,然后我們才能對它們執行操作,最后將它們提交給 SQL。我們現在只需一個操作就可以做到這一點,這會產生一個 SQL 命令。

讓我們看看它在代碼中的樣子。

設置場景

在我們深入示例之前,讓我們首先配置我們的 SQL 數據庫并填充 3 個表:

  • Persons: 人

  • Addresses: 地址( 一個人有一個地址)

  • Pets: 寵物(一個人可以養很多寵物)

using?Microsoft.EntityFrameworkCore;using?(var?context?=?new?NewInEFContext())
{SetupAndPopulate(context);
}static?void?SetupAndPopulate(NewInEFContext?context)
{context.Database.EnsureDeleted();context.Database.EnsureCreated();context.Persons.AddRange(Enumerable.Range(1,?1_000).Select(i?=>{return?new?Person{FirstName?=?$"{nameof(Person.FirstName)}-{i}",LastName?=?$"{nameof(Person.LastName)}-{i}",Address?=?new?Address{Street?=?$"{nameof(Address.Street)}-{i}",},Pets?=?Enumerable.Range(1,?3).Select(i2?=>{return?new?Pet{Breed?=?$"{nameof(Pet.Breed)}-{i}-{i2}",Name?=?$"{nameof(Pet.Name)}-{i}-{i2}",};}).ToList()};}));context.SaveChanges();
}public?class?NewInEFContext?:?DbContext
{public?DbSet<Person>?Persons?{?get;?set;?}public?DbSet<Pet>?Pets?{?get;?set;?}public?DbSet<Address>?Addresses?{?get;?set;?}protected?override?void?OnConfiguring(DbContextOptionsBuilder?options)=>?options.UseSqlServer("Connectionstring");protected?override?void?OnModelCreating(ModelBuilder?modelBuilder){modelBuilder.Entity<Address>().Property<long>("PersonId");modelBuilder.Entity<Pet>().Property<long>("PersonId");}
}public?class?Person
{public?long?PersonId?{?get;?set;?}public?string?FirstName?{?get;?set;?}?=?"";public?string?LastName?{?get;?set;?}?=?"";public?Address??Address?{?get;?set;?}public?List<Pet>?Pets?{?get;?set;?}?=?new?List<Pet>();
}public?class?Address
{public?long?AddressId?{?get;?set;?}public?string?Street?{?get;?set;?}?=?"";
}public?class?Pet
{public?long?PetId?{?get;?set;?}public?string?Breed?{?get;?set;?}?=?"";public?string?Name?{?get;?set;?}?=?"";
}

ExecuteDelete 和 ExecuteDeleteAsync

既然我們已經解決了這個問題,讓我們深入研究ExecuteDeleteExecuteDeleteAsync

要批量刪除一組實體,請使用Where方法過濾掉要刪除的實體(與之前類似)。然后,調用ExecuteDelete方法刪除實體集合。

using?(var?context?=?new?NewInEFContext())
{SetupAndPopulate(context);context.Pets.Where(p?=>?p.Name.Contains("1")).ExecuteDelete();
}

讓我們也看看它生成的 SQL 語句:

DELETE?FROM?[p]
FROM?[Pets]?AS?[p]
WHERE?[p].[Name]?LIKE?N'%1%'

如您所見,它只是生成一條 SQL 語句來刪除符合條件的實體。這些實體也不再保存在內存中。不錯,簡單,高效!

級聯刪除

讓我們看另一個例子,讓我們刪除一些持有地址和寵物引用的人。通過刪除人員,我們也刪除了地址和寵物,因為刪除語句級聯到外部表。

using?(var?context?=?new?NewInEFContext())
{SetupAndPopulate(context);context.Persons.Where(p?=>?p.PersonId?<=?500).ExecuteDelete();
}

與之前類似,這會產生以下 SQL 語句:

DELETE?FROM?[p]
FROM?[Persons]?AS?[p]
WHERE?[p].[PersonId]?<=?CAST(500?AS?bigint)

受影響的行數

還可以查看刪除操作影響了多少行,ExecuteDelete返回受影響的行數。

using?(var?context?=?new?NewInEFContext())
{SetupAndPopulate(context);var?personsDeleted?=context.Persons.Where(p?=>?p.PersonId?<=?100).ExecuteDelete();
}

在上面的表達式中,personsDeleted變量等于 100。

ExecuteUpdate 和 ExecuteUpdateAsync

現在我們已經了解了如何刪除實體,讓我們探索如何更新它們。就像ExecuteDelete,我們首先必須過濾我們想要更新的實體,然后調用ExecuteUpdate.

要更新實體,我們需要使用新SetProperty方法。SetProperty的第一個參數是通過 lambda 選擇需要更新的屬性,第二個參數也使用 lambda 選擇該屬性的新值,。

例如,讓我們將人員的姓氏設置為“Updated”。

using?(var?context?=?new?NewInEFContext())
{SetupAndPopulate(context);context.Persons.Where(p?=>?p.PersonId?<=?1_000).ExecuteUpdate(p?=>?p.SetProperty(x?=>?x.LastName,?x?=>?"Updated"));
}

這會生成相應的 SQL 語句:

UPDATE?[p]SET?[p].[LastName]?=?N'Updated'
FROM?[Persons]?AS?[p]
WHERE?[p].[PersonId]?<=?CAST(1000?AS?bigint)

我們還可以訪問實體的值并使用它來創建新值。

using?(var?context?=?new?NewInEFContext())
{SetupAndPopulate(context);context.Persons.Where(p?=>?p.PersonId?<=?1_000).ExecuteUpdate(p?=>?p.SetProperty(x?=>?x.LastName,?x?=>?"Updated"?+?x.LastName));
}

產生以下 SQL 語句:

UPDATE?[p]SET?[p].[LastName]?=?N'Updated'?+?[p].[LastName]
FROM?[Persons]?AS?[p]
WHERE?[p].[PersonId]?<=?CAST(1000?AS?bigint)

一次更新多個值

我們甚至可以通過多次調用SetProperty來一次更新多個屬性。

using?(var?context?=?new?NewInEFContext())
{SetupAndPopulate(context);context.Persons.Where(p?=>?p.PersonId?<=?1_000).ExecuteUpdate(p?=>p.SetProperty(x?=>?x.LastName,?x?=>?"Updated"?+?x.LastName).SetProperty(x?=>?x.FirstName,?x?=>?"Updated"?+?x.FirstName));
}

再一次,對應的 SQL 語句:

UPDATE?[p]SET?[p].[FirstName]?=?N'Updated'?+?[p].[FirstName],[p].[LastName]?=?N'Updated'?+?[p].[LastName]
FROM?[Persons]?AS?[p]
WHERE?[p].[PersonId]?<=?CAST(1000?AS?bigint)

受影響的行數

就像ExecuteDelete,ExecuteUpdate也返回受影響的行數。

using?(var?context?=?new?NewInEFContext())
{SetupAndPopulate(context);var?personsUpdated?=context.Persons.Where(p?=>?p.PersonId?<=?1_000).ExecuteUpdate(p?=>?p.SetProperty(x?=>?x.LastName,?x?=>?"Updated"));
}

請注意,不支持更新嵌套實體。

Entity Framework 7 中的更多更新

有關新功能的完整列表,請參閱EF 7 計劃[3]

參考資料

[1]

Julie Lerman 的一條推文: https://twitter.com/julielerman

[2]

https://twitter.com/julielerman/status/1557743067691569156: https://twitter.com/julielerman/status/1557743067691569156

[3]

EF 7 計劃: https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/plan?WT.mc_id=DT-MVP-5004452

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/282858.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282858.shtml
英文地址,請注明出處:http://en.pswp.cn/news/282858.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 簡單json和對象相互轉換

2019獨角獸企業重金招聘Python工程師標準>>> package Fasterxml; import com.fasterxml.jackson.databind.ObjectMapper; import mode.User; import java.io.StringWriter; import java.util.ArrayList; import java.util.List;/*** maven...**<dependency>* …

暢想動畫制作的樂趣

為什么要制作動畫&#xff1f; 現在的營銷活動&#xff0c;用一個很簡單的圖片去吸引消費者已經遠遠不夠。想讓消費者創造GMV&#xff0c;肯定需要讓消費者覺得眼前一亮或是有視覺沖擊的東西&#xff0c;或者在動畫過程中提供更好的引導部分&#xff0c;比如紅包&#xff0c;引…

Linux的scan命令,linux的scan命令

linux下scan命令主要是以scanf的形式使用轉換符解析字符串&#xff0c;下面由秋天網 Qiutian.ZqNF.Com小編為大家整理了linux下scan命令的相關知識&#xff0c;希望對大家有幫助!linux的scan命令詳解scan - 以sscanf的形式使用轉換符解析字符串語法:scan string format ?varna…

Spring Cloud Gateway 原生支持接口限流該怎么玩

關于pig&#xff1a; 基于Spring Cloud、oAuth2.0開發基于Vue前后分離的開發平臺&#xff0c;支持賬號、短信、SSO等多種登錄&#xff0c;提供配套視頻開發教程。 關于 Spring Cloud Gateway SpringCloudGateway是Spring官方基于Spring 5.0&#xff0c;Spring Boot 2.0和Projec…

我的手機 不支持箭頭函數

不支持&#xff0c;要換成function的形式 轉載于:https://www.cnblogs.com/web-fusheng/p/7295901.html

中標麒麟linux卸載qt,國產化 銀河麒麟編譯Qt程序的問題匯總 | 阿拉燈

Run in terminal莫名奇妙軟件無法在QtCreator中運行或者調試&#xff0c;main函數都無法進入&#xff0c;QtCreator中一運行就崩潰&#xff0c;并跳到匯編界面&#xff0c;這多半和代碼沒什么關系&#xff0c;我這里是將項目->運行中的“Run in terminal”去掉勾選&#xff…

css3-13 如何改變文本框的輪廓顏色

css3-13 如何改變文本框的輪廓顏色 一、總結 一句話總結&#xff1a;outline使用和border很像&#xff0c;幾乎一模一樣&#xff0c;多了一個offset屬性 1、輪廓outline如何使用&#xff1f; 使用和border很像&#xff0c;幾乎一模一樣&#xff0c;多了一個offset屬性 18 …

ios添加設備真機測試,以及Undefined symbols for architecture x86_64:''錯誤

問題今天坑了好久&#xff0c;然后找了各種資料 添加設備這個直接去開發者中心添加一個設備進去就好&#xff0c;具體流程百度&#xff0c;第二個問題是屬于路徑不對或者是靜態庫沒有添加成功&#xff0c;項目可以看到&#xff0c;到時路徑找不到&#xff0c;你把靜態庫拖到桌面…

linux NF NR實例,awk內建變量示例詳解之NR、FNR、NF

NR表示從awk開始執行后&#xff0c;按照記錄分隔符讀取的數據次數&#xff0c;默認的記錄分隔符為換行符&#xff0c;因此默認的就是讀取的數據行數&#xff0c;NR可以理解為Number of Record的縮寫。在awk處理多個輸入文件的時候&#xff0c;在處理完第一個文件后&#xff0c;…

迷宮探索

/* 5 4 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 4 3 */#include<iostream>using namespace std;struct node {int x;//橫坐標int y;//縱坐標int f;//父親在隊列中的編號int s;//步數 };int main() {node que[2051];int a[51][51]{0};int book[51][51]{0};//定義一…

Kinect2.0獲取數據

最近事情真是多&#xff0c;今天抽空研究一下Kinec2.0的數據獲取&#xff01; 系統要求 https://developer.microsoft.com/en-us/windows/kinect/hardware-setup 系統環境 聯想Y430P&#xff0c;Windows10 首先安裝了Kinect for Windows SDK &#xff08;KinectSDK-v2.0_1409-S…

linux超級工具,linux運維超級工具--sysdig

sysdig 是一個超級系統工具,它可以用來捕獲系統狀態信息&#xff0c;在運維工作中sysdig能很方便的排查異常、定位故障&#xff0c;它還能保存數據進行分析&#xff0c;并且提供強大的命令接口。在了解sysdig強大之處之前,首先得安裝sysdig&#xff0c;我這里是環境是centos6.7…

《sql語句練習1》

Oracle系列《一》&#xff1a;簡單SQL與單行函數 使用scott/tiger用戶下的emp表和dept表完成下列練習&#xff0c;表的結構說明如下 emp員工表(empno員工號/ename員工姓名/job工作/mgr上級編號/hiredate受雇日期/sal薪金/comm傭金/deptno部門編號) dept部門表(deptno部門編號…

Asp.net mvc 知多少(一)

本系列主要翻譯自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan&#xff0c;想看英文原版的可訪問http://www.dotnettricks.com/free-ebooks自行下載。該書主要分為兩部分&#xff0c;ASP.NET MVC 5、ASP.NET WEB API2。本書最大的特點是以面試問答…

stm32h7能跑linux,STM32H7榨干了Cortex-M7的最后一滴血

原標題&#xff1a;STM32H7榨干了Cortex-M7的最后一滴血有個非常重磅的消息ST給自己的STM32家族又新增了一條新的產品線—— H7H 代表的是High Pefrmance之意 (此為筆者臆測)7 則表示這是基于ARM Cortex-M7架構修改而來熟悉的工程師可能會問&#xff0c;不是已經有基于M7架構的…

通過PowerShell進行網絡分析

好久沒有寫文章&#xff0c;因為確實工作也比較忙。今天周末&#xff0c;稍微有些時間&#xff0c;在解決一個問題時&#xff0c;用到了一點抓取和處理網絡數據的小技巧&#xff0c;摘錄分享如下。問題描述我有一個需求&#xff0c;就是要研究某個網頁加載過程中具體發起了多少…

jvm監控調優常用命令

jvm監控調優常用命令 轉載于:https://www.cnblogs.com/likun10579/p/6403324.html

【BZOJ】1013 球形空間產生器

【解析】代數變形高斯消元 [分析] 依據題目以下的提示。設x[i][j]表示第i個點在第j維的坐標。r[j]為圓心在第j維的坐標 能夠知道&#xff1a; dis根號(∑(x[i][j]-r[j])^2)。 因為平方的非負性。所以能夠推出 dis^2∑(x[i][j]-r[j])^2。 依據平方和公式&#xff0c;(x[i][j]-r[…

c語言不規則窗口,C語言不規則數組和指針

不規則數組是每一行的列數不一樣的二維數組&#xff0c;其原理如下圖所示&#xff0c;圖中的數組有3行&#xff0c;每行有不同的列數。在了解如何創建不規則數組之前&#xff0c;讓我們先看一下用復合字面量創建的二維數組。復合字面量是一種C構造&#xff0c;前面看起來像類型…

php spl_autoload_register() 函數

spl_autoload_register()的用法&#xff1a; 其中$this表示當前類&#xff0c;autoload()是我注冊的自動加載函數&#xff0c;當然這個只是一個函數名&#xff0c;只要不與php的關鍵字重復&#xff0c;符合一般函數名的命名規范即可。 使用自動加載之后&#xff0c;當我們在一個…