對EF Core進行擴展使支持批量操作/復雜查詢


對EF Core進行擴展使支持批量操作/復雜查詢

EF Core的問題一言難盡,然后有了各種插件,批量插入擴展,批量更新擴展,查詢擴展。。。然后一個項目引入一堆擴展

解決此問題

  1. 安裝nuget包:CRL.EFCore.Extensions
  2. using CRL;
    using CRL.EFCore.Extensions;

實現數據批量操作

配置實體映射,調用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 獲取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();

ILambdaQuery能實現子查詢和嵌套查詢,只要符合T-SQL語義邏輯,可以使用ILambdaQueryResultSelect無限疊加

如:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM