ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

EF Core 优化、实体状态跟踪、批量操作、全局查询筛选器

2022-07-28 01:02:03  阅读:292  来源: 互联网

标签:Core 批量 EF ctx 查询 Book 筛选


EF Core 优化、实体状态跟踪、批量操作、全局查询筛选器

EF Core 优化之AsNoTracking

当数据仅仅只是做查询不修改的情况下,尤其是数据量还不小的情况下,使用可以减少内存的消耗

 var u2 = await ctx.Users.AsNoTracking().Take(3).ToListAsync(); 
注意:

如果使用了AsNoTracking()之后下面对对象进行了修改,调用SaveChangesAsync()并不会对数据库的数据进行修改。

EF Core 实体状态跟踪的妙用
 //先查询 在修改 实际是执行了2次sql语句
 var book = await ctx.Books.FirstAsync();
 book.Price = 101;
 ctx.SaveChanges();
 ​
 //下面只执行了一次sql语句
 Book b1 = new Book { Title = "标题" + 10086, PubTime = DateTime.UtcNow, Price = 101, AuthorName = "firstsaofan" + 10086 };//此处状态是已分离
 var entry1 = ctx.Entry(b1);
 entry1.Property("Price").IsModified = true;
 ctx.SaveChanges();
 ​
 //直接删除这条记录
 Book b3 = new Book { Id = 2 };
 ctx.Entry(b3).State = EntityState.Deleted;
 ctx.SaveChanges();
 ​
总结:

上述代码能看懂即可,不推荐使用,由此带来的性能提升很微弱,使用不当,弊大于利。仅作了解

EF Core 批量插入,更新,删除(2022.07.27)

此时EF Core不支持高效的删除,更新,插入数据,都是逐条操作AddRange、DeleteRange等

微软计划EF Core7 会有此功能大约在2022.11 对应今年的Net7在同月发布

sqlBulkCopy(批量操作)

微软官方issue

Zack.EFCore.Batch nuget包 支持批量操作

EF Core全局查询筛选器

使用场景: 逻辑删除数据(软删除)、多租户

 //在对应的实体的config类文件里面的config方法加上
 builder.HasQueryFilter(e => e.IsDeleted == false);
 //之后所有的查询默认都会加上这个条件
 //如果在特定不需要全局筛选器 使用IgnoreQueryFilters()即可
 foreach (var item in ctx.Books.IgnoreQueryFilters().Where(b => b.AuthorName.Contains("fir")))
 {
     Console.WriteLine(item.Id+item.Title);
 }

注意事项:

使用全局筛选器之后,根据具体项目的实际情况,可能会影响性能,到时候需要自己来对筛选条件的字段添加索引,不一定会产生性能问题。但是如果产生,这是一个解决方向。

 

标签:Core,批量,EF,ctx,查询,Book,筛选
来源: https://www.cnblogs.com/firstsaofan/p/16527082.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有