EFCore.BulkExtensions使用BatchUpdateAsync()批量更新
最近在项目中用到了这个关于批量操作的包
所以我去看了下官方的文档,批量更新的用法如下:
// Update (using Expression arg.) supports Increment/Decrement context.Items.Where(a => a.ItemId <= 500).BatchUpdate(a => new Item { Quantity = a.Quantity + 100 }); context.Items.Where(a => a.ItemId <= 500).BatchUpdateAsync(a => new Item { Quantity = a.Quantity + 100}); // can be as value '+100' or as variable '+incrementStep' (int incrementStep = 100;) // Update (via simple object) context.Items.Where(a => a.ItemId <= 500).BatchUpdate(new Item { Description = "Updated" }); context.Items.Where(a => a.ItemId <= 500).BatchUpdateAsync(new Item { Description = "Updated" }); // Update (via simple object) - requires additional Argument for setting to Property default value var updateCols = new List<string> { nameof(Item.Quantity) }; // Update 'Quantity' to default value ('0') var q = context.Items.Where(a => a.ItemId <= 500); int affected = q.BatchUpdate(new Item { Description="Updated" }, updateCols); // result assigned to aff
看起来都很简单,使用 BatchUpdate() 函数再 new 一个对象,需要修改哪个属性便赋值哪个属性即可。
但我又有点疑惑了,这个 Item 类是只有一个属性吗?如果 Item 有多个属性我需不需要全写?还是只写我需要更新的那个?
于是我测试了一下,确实只需要对更新的属性赋值便可,真的不用全写(人菜问题多😭)
现在进入正题,代码如何实现可以知道赋值的属性是哪个?
源码大致如下:
private static string GetSqlSetSegment(TableInfo tableInfo, object? updateValues, List<string>? updateColumns) {
// 构建一个默认对象
object? updateValues = Activator.CreateInstance(updateValues?.GetType());foreach (var item in tableInfo.PropertyColumnNamesDict) {
//........
PropertyInfo propertyInfo = updateValues?.GetType().GetProperty(key); if (!(propertyInfo != null)) { continue; } // 从更新对象获取属性更新值 object obj = propertyInfo.GetValue(updateValues);
// 从默认对象获取属性默认值 object obj2 = propertyInfo.GetValue(defaultValues); //........... // 比较两个值,如果相等则认为这个属性是默认值即没有赋值,也就不参与更新 bool flag = obj != null && obj?.ToString() != obj2?.ToString();
// 还可以指定更新列
bool flag2 = updateColumns?.Contains(key) ?? false; if (!(flag || flag2)) { continue; } // ............... }
特别简单一个代码,但是很有意思啊,通过和默认值比较来判断是否参与更新,除了没办法再更新回默认值(这时似乎得指定更新列了),至少是可以少写一部分代码了
但是感觉还是有点问题,所以我决定还是不用这个了🤣🤣🤣
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?