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; }           // ............... }
复制代码

特别简单一个代码,但是很有意思啊,通过和默认值比较来判断是否参与更新,除了没办法再更新回默认值(这时似乎得指定更新列了),至少是可以少写一部分代码了

 但是感觉还是有点问题,所以我决定还是不用这个了🤣🤣🤣

 

 

 
 
 
posted @   该昵称已被屏蔽  阅读(623)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示