EF Core中高效批量删除、更新数据的Zack.EFCore.Batch发布三个新特性

Zack.EFCore.Batch是一个支持在Entity Framework Core中高效删除和更新数据的开源库。我们知道,EF Core中不支持高效的删除和更新数据,所有的更新和操作都是逐条数据处理。比如,如果使用如下的语句删除实现“删除所有价格大于10元的书“:

ctx.RemoveRange(ctx.Books.Where(b=> b.Price > 33))

那么,EntityFramework Core会先执行Select * from books where price>33,然后再对于每一条数据执行delete from books where id=@id进行删除。EF Core中批量数据的更新原理也是类似。因此在EF Core中进行大量数据的批量删除、更新效率是比较低的。

为了能够实现 “一句SQL实现数据的删除、更新“,我开发了开源项目Zack.EFCore.Batch,这个开源项目实现了如下批量删除的写法:

await ctx.DeleteRangeAsync<Book>(b => b.Price > n || b.AuthorName =="zack yang");

 上面的C#代码就会执行如下的SQL语句,从而实现“一句SQL删除数据“的效果:

Delete FROM[T_Books] WHERE ([Price] > @__p_0) OR ([AuthorName] = @__s_1)

  这个开源项目使用EF Core实现SQL语句的翻译,因此只要EF Core支持的数据库,对应的Linq操作都可以实现翻译成对应的方言SQL,比如下面的批量更新操作的Linq代码:

await ctx.BatchUpdate<Book>()
   .Set(b => b.Price, b => b.Price + 3)
   .Set(b => b.Title, b => s)
   .Set(b =>b.AuthorName,b=>b.Title.Substring(3,2)+b.AuthorName.ToUpper())
   .Set(b => b.PubTime, b => DateTime.Now)
   .Where(b => b.Id > n || b.AuthorName.StartsWith("Zack"))
.ExecuteAsync();

 在SQL Server数据库下就会翻译成一条Update语句,如下:

Update [T_Books]SET [Price] = [Price] + 3.0E0, [Title] = @__s_1, [AuthorName] =COALESCE(SUBSTRING([Title], 3 + 1, 2), N'') + COALESCE(UPPER([AuthorName]),N''), [PubTime] = GETDATE()
WHERE ([Id] >@__p_0) OR ([AuthorName] IS NOT NULL AND ([AuthorName] LIKE N'Zack%'))

 经历用户几个月的使用和反馈issue,目前项目已经升级到1.4.3版,支持SQLServer、MySQL、PostgreSQL、Oracle、SQLite数据库。理论上来讲,只要EF Core支持的数据库,Zack.EFCore.Batch都可以支持。如果您有其他数据库需要支持,请和我联系。

除了已有的特性之外,Zack.EFCore.Batch新版增加了如下特性。

 

特性一、基于实体关系的数据过滤

    在过滤条件中支持实体之间的关系。例如:

ctx. DeleteRangeAsync<Article>(a=>a.Comments.Any(c=>c.Message.Contains(“History”))
||a.Author.BirthDay.Year<2000);

 特性二、支持数据的批量插入

可以用如下的方式进行高效的批量插入:

List<Book> books = new List<Book>();
for (int i = 0; i < 100; i++)
{
       books.Add(newBook { AuthorName = "abc" + i, Price = new Random().NextDouble(),PubTime = DateTime.Now, Title = Guid.NewGuid().ToString() });
}
using (TestDbContext ctx = newTestDbContext())
{
       ctx.BulkInsert(books);
}

       BulkInsert()底层使用各个数据库的BulkCopy机制实现数据插入,因此插入效率非常高。目前有如下两个缺点:不支持关联数据的自动插入,对于关联的对象,请同样调用BulkInsert()进行插入;由于PostgreSQL的.NET Core Provider还没有支持BulkCopy,所以目前Zack.EFCore.Batch暂不支持PostgreSQL,我后面再去想办法解决。

 

特征三、支持Take()、Skip()来限制删除和更新数据的范围

       批量删除和批量更新都支持通过Take()、Skip()来实现部分删除和部分更新,例子代码如下:

await ctx.Comments.Where(c =>c.Article.Id == id).Skip(3)
.DeleteRangeAsync<Comment>(ctx);
await ctx.Comments.Where(c =>c.Article.Id == id).Skip(3).Take(10)
.DeleteRangeAsync<Comment>(ctx);
await ctx.Comments.Where(c =>c.Article.Id == id).Take(10)
.DeleteRangeAsync<Comment>(ctx);
 
awaitctx.BatchUpdate<Comment>().Set(c => c.Message, c => c.Message +"abc")
       .Where(c=> c.Article.Id == id)
       .Skip(3)
       .ExecuteAsync();
 
await ctx.BatchUpdate<Comment>().Set(c=> c.Message, c => c.Message + "abc")
       .Where(c=> c.Article.Id == id)
       .Skip(3)
       .Take(10)
       .ExecuteAsync();
awaitctx.BatchUpdate<Comment>().Set(c => c.Message, c => c.Message +"abc")
  .Where(c => c.Article.Id == id)
  .Take(10)
  .ExecuteAsync();

 

具体用法请访问开源项目地址:

https://github.com/yangzhongke/Zack.EFCore.Batch

NuGet地址:https://www.nuget.org/packages/Zack.EFCore.Batch/

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]的代码是ekf_localization_node.cpp的一部分,主要包括实例化RosEkf和初始化RosEkf两个部分。在实例化RosEkf部分,首先通过ros::init初始化ROS节点,然后创建NodeHandle对象,接着创建私有的NodeHandle对象,最后通过RosEkf类的构造函数实例化RosEkf对象。在初始化RosEkf部分,调用了RosEkf类的initialize函数进行初始化操作。最后通过ros::spin()函数进入ROS循环,等待接收和处理消息。 引用\[2\]的内容是对ekf_localization_node的源码进行解析。其提到了实例化RosEkf和初始化RosEkf的过程。在初始化RosEkf的过程,包括加载参数和循环处理函数。加载参数的过程通过loadParams()函数实现,循环处理函数通过periodicUpdate()函数实现,其包括了Ekf::predict()和Ekf::correct()两个函数。 引用\[3\]的内容是关于获取最终状态的噪声协方差矩阵的代码。通过计算得到的协方差矩阵可以用于更新估计误差协方差矩阵。具体的计算过程是通过Joseph形式进行计算,其涉及到矩阵的乘法和转置操作。 根据以上引用内容,问题的代码if (!nodeHandle_.param("node_rate", node_rate_, 1))是在ekf_localization_node.cpp的一部分,用于获取参数"node_rate"的值并将其赋给变量node_rate_。如果获取参数失败,则将node_rate_的值设置为1。 #### 引用[.reference_title] - *1* *2* *3* [robot_localization 源码解析(1)ekf_localization_node](https://blog.csdn.net/zack_liu/article/details/112344346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值