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

Posted Spook

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对EF Core进行扩展使支持批量操作/复杂查询相关的知识,希望对你有一定的参考价值。

对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)

以上是关于对EF Core进行扩展使支持批量操作/复杂查询的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 上的 EF Core 批量删除

Entity Framework Extended Library (EF扩展类库,支持批量更新删除合并多个查询等)

Entity Framework Extended Library (EF扩展类库,支持批量更新删除合并多个查询等)

查缺补漏系统学习 EF Core 6 - 批量操作

EF Core 全局查询过滤器复杂表达式

Entity Framework Extended Library (EF扩展类库,支持批量更新删除合并多个查询等)