写点什么

对 EF Core 进行扩展使支持批量操作 / 复杂查询

用户头像
Spook
关注
发布于: 2021 年 07 月 06 日

对 EF Core 进行扩展使支持批量操作/复杂查询

EF Core 的问题一言难尽,然后有了各种插件,批量插入扩展,批量更新扩展,查询扩展。。。然后一个项目引入一堆扩展


解决此问题


  1. <u>安装 nuget 包:CRL.EFCore.Extensions</u>

  2. <u>using CRL;</u><u>using CRL.EFCore.Extensions;</u>

实现数据批量操作

配置实体映射,调用 ConfigEntityTypeBuilder 扩展方法


protected override void OnModelCreating(ModelBuilder modelBuilder)        {            var e = modelBuilder.Entity<TestClass>();            e.ToTable("TestClass", "dbo");            e.HasKey(b => b.Id);            e.Property(b => b.Name).HasMaxLength(50) ;            e.ConfigEntityTypeBuilder();            base.OnModelCreating(modelBuilder);        }
复制代码


获取 DbContext 的 IDbConnection dbConnection


通过扩展方法 GetDBExtend 获取 IAbsDBExtend 对象


    public IAbsDBExtend GetDBExtend()    {        return dbConnection.GetDBExtend(dbTrans);    }
复制代码


使用 IAbsDBExtend 实现批量操作


var db = context.GetDBExtend();db.BatchInsert(new List<TestClass>() { new TestClass() { Id = DateTime.Now.Millisecond, Name = "ddddd" } },true);db.Update(b => b.Id == 1, new { Number = 2 });
复制代码


IAbsDBExtend 可以实现所有数据操作,如:


  1. 批量更新

  2. 批量删除

  3. 批量插入

  4. 存储过程

  5. 表字段、索引检查

实现复杂查询

通过扩展方法**GetLambdaQuery<T>**获取 ILambdaQuery 对象


public ILambdaQuery<T> GetLambdaQuery<T>() where T : class        {            return dbConnection.GetLambdaQuery<T>(dbTrans);        }
复制代码


使用 ILambdaQuery 实现查询


var query = context.GetLambdaQuery<TestClass>();                query.Join<TestClass2>((a, b) => a.Id == b.Id);                query.PrintQuery();
复制代码


<u>ILambdaQuery 能实现子查询和嵌套查询,只要符合 T-SQL 语义逻辑,可以使用 ILambdaQueryResultSelect 无限叠加</u>


如:


  • join 后 group

  • join 后再 join

  • group 后再 join

  • join 一个 group 结果

  • join 一个 union 结果

  • 对 union 进行 group 再 join

  • ...


示例查询:


var q1 = GetLambdaQuery();            var q2 = q1.CreateQuery<Code.ProductData>();            q2.Where(b => b.Id > 0);            var view = q2.CreateQuery<Code.Member>().Where(b => b.Id > 0).GroupBy(b => b.Name).Select(b => new { b.Name, aa = b.Id.COUNT() });//GROUP查询            var view2 = q2.Join(view, (a, b) => a.CategoryName == b.Name).Select((a, b) => new { ss1 = a.UserId, ss2 = b.aa });//关联GROUP            q1.Join(view2, (a, b) => a.Id == b.ss1).Select((a, b) => new { a.Id, b.ss1 }).ToList();//再关联            //var result = view2.ToList();            var sql = q1.PrintQuery();
复制代码


源码示例参考Data/EFTest · hubroxxl/CRL - 码云 - 开源中国 (gitee.com)


高级的查询方法见源码示例


Data/QueryTest/test · hubroxxl/CRL - 码云 - 开源中国 (gitee.com)

用户头像

Spook

关注

还未添加个人签名 2021.06.24 加入

还未添加个人简介

评论

发布
暂无评论
对EF Core进行扩展使支持批量操作/复杂查询