對EF Core進行擴充使支援批量操作/複雜查詢
EF Core的問題一言難盡,然後有了各種插件,批量插入擴充,批量更新擴充,查詢擴充。。。然後一個項目引入一堆擴充
解決此問題
- 安裝nuget包:CRL.EFCore.Extensions
-
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可以實作所有資料操作,如:
- 批量更新
- 批量删除
- 批量插入
- 存儲過程
- 表字段、索引檢查
實作複雜查詢
通過擴充方法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)