基于.NET 6.0 自研輕量級(jí)ORM框架
Fast Framework
項(xiàng)目:https://gitee.com/China-Mr-zhong/Fast.Framework
一、前言
1、為了實(shí)現(xiàn)快速開發(fā),省去編寫大量Sql時(shí)間,更好的面向?qū)ο缶幊逃纱苏Q生了 Fast Framework
2、Fast Framework 是一個(gè)基于.NET 6.0 封裝的輕量級(jí) ORM 框架 支持?jǐn)?shù)據(jù)庫(kù) SqlServer Oracle MySql PostgreSql Sqlite 由于底層使用System.Data.Common 抽象類封裝 理論支持所有Ado.Net 實(shí)現(xiàn)的類庫(kù),差異部分可能需要額外處理。
3、框架
優(yōu)點(diǎn):體積小 流暢API 使用更加簡(jiǎn)單 性能高
缺點(diǎn):不具備有自動(dòng)建庫(kù)建表遷移等復(fù)雜的功能 由于不同數(shù)據(jù)庫(kù)差異較大 實(shí)現(xiàn)較為復(fù)雜 所以暫時(shí)不考慮實(shí)現(xiàn)
二、項(xiàng)目明細(xì) (后綴為Test均為測(cè)試項(xiàng)目)
1、Fast.Framework
2、Fast.Framework.CustomAttribute
3、Fast.Framework.Extensions
4、Fast.Framework.Interfaces
5、Fast.Framework.Logging
6、Fast.Framework.Models
7、Fast.Framework.Utils
三、快速入門
1、手動(dòng)創(chuàng)建
var?options?=?new?DefaultDbOptions()?//數(shù)據(jù)選項(xiàng)
????????????????{
????????????????????DbType?=?DbType.MySQL,
????????????????????ProviderName?=?"MySqlConnector",
????????????????????FactoryName?=?"MySqlConnector.MySqlConnectorFactory,MySqlConnector",
????????????????????ConnectionStrings?=?"server=localhost;database=Test;user=root;pwd=123456789;port=3306;min?pool?size=3;max?pool?size=100;connect?timeout?=30;AllowLoadLocalInfile=True;"
????????????????};
????????????var?ado?=?new?Ado(options);//原生Ado
????????????var?db?=?new?DbContext(ado);//數(shù)據(jù)庫(kù)上下文
2、依賴注入
var?builder?=?WebApplication.CreateBuilder(args);
//?正式項(xiàng)目請(qǐng)用配置文件注入,為了測(cè)試方便直接引用實(shí)現(xiàn)類庫(kù)
builder.Services.AddScoped<IAdo<DefaultDbOptions>,?Ado<DefaultDbOptions>>();
builder.Services.AddScoped<IDbContext<DefaultDbOptions>,?DbContext<DefaultDbOptions>>();
3、加載Json配置文件
builder.Services.Configure<DefaultDbOptions>(configuration.GetSection("DbFactory:MySqlDb"));
4、Json 格式
"DbFactory":?{
????"MySQLDb":?{
??????"DbType":?"MySQL",
??????"ProviderName":?"MySqlConnector",
??????"FactoryName":?"MySqlConnector.MySqlConnectorFactory,MySqlConnector",
??????"ConnectionStrings":?"server=localhost;database=Test;user=root;pwd=123456789;port=3306;min?pool?size=3;max?pool?size=100;connect?timeout?=30;"
????},
????"SQLServerDb":?{
??????"DbType":?"SQLServer",
??????"ProviderName":?"System.Data.SqlClient",
??????"FactoryName":?"System.Data.SqlClient.SqlClientFactory,System.Data",
??????"ConnectionStrings":?"server=localhost;database=Test;user=sa;pwd=123456789;min?pool?size=3;max?pool?size=100;connect?timeout?=30;"
????},
????"OracleDb":?{
??????"DbType":?"Oracle",
??????"ProviderName":?"Oracle.ManagedDataAccess.Client",
??????"FactoryName":?"Oracle.ManagedDataAccess.Client.OracleClientFactory,Oracle.ManagedDataAccess",
??????"ConnectionStrings":?"data?source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)));user?id=system;password=Oracle2022;min?pool?size=3;max?pool?size=100;connect?timeout?=30;"
????},
????"PostgreSQLDb":?{
??????"DbType":?"PostgreSQL",
??????"ProviderName":?"Npgsql",
??????"FactoryName":?"Npgsql.NpgsqlFactory,Npgsql",
??????"ConnectionStrings":?"host=localhost;database=test;userid=postgres;pwd=123456789;port=5432;"
????},
????"SQLiteDb":?{
??????"DbType":?"SQLite",
??????"ProviderName":?"System.Data.SQLite",
??????"FactoryName":?"System.Data.SQLite.SQLiteFactory,System.Data.SQLite",
??????"ConnectionStrings":?"data?source=mysqlite.db;pooling=true;"
????}
??}
5、Controller 構(gòu)造方法注入已注冊(cè)的DbContext對(duì)象
namespace?Fast.Framework.Web.Test.Controllers
{
????[Route("api/[controller]/[action]")]
????[ApiController]
????public?class?ProductController?:?ControllerBase
????{
????????///?
????????///?數(shù)據(jù)庫(kù)
????????///?
????????private?readonly?IDbContext?db;
????????///?
????????///?日志
????????///?
????????private?readonly?ILogger?logger;
????????///?
????????///?構(gòu)造方法
????????///?
????????///?
????????public?ProductController(ILogger?logger,?IDbContext?db )
????????{
????????????this.db?=?db;
????????????this.logger?=?logger;
????????}
????}
}
6、示例
#region?增?刪?改
//實(shí)體對(duì)象插入
{
????var?result?=?await?db.Insert(new?ProductModel()?{?ProductCode?=?"1001",?ProductName?=?"測(cè)試產(chǎn)品1"?}).ExecuteAsync();
????Console.WriteLine(result);
}
//實(shí)體對(duì)象插入并返回自增ID?僅支持?SQLServer?Mysql?Sqlite
{
????var?result?=?await?db.Insert(new?ProductModel()?{?ProductCode?=?"1001",?ProductName?=?"測(cè)試產(chǎn)品1"?}).ExecuteReturnIdentityAsync();
????Console.WriteLine(result);
}
//實(shí)體對(duì)象列表插入?列表插入不支持批量返回自增ID
{
????var?list?=?new?List();
????list.Add(new?ProductModel()?{?ProductCode?=?"1001",?ProductName?=?"測(cè)試產(chǎn)品1"?});
????list.Add(new?ProductModel()?{?ProductCode?=?"1002",?ProductName?=?"測(cè)試產(chǎn)品2"?});
????var?result?=?await?db.Insert(list).ExecuteAsync();
????Console.WriteLine(result);
}
//匿名對(duì)象插入?必須使用?As?方法顯示指定表名稱
{
????var?result?=?db.Insert(new?{?ProductCode?=?"1001",?ProductName?=?"測(cè)試產(chǎn)品1"?}).As("Product").ExecuteAsync();
????Console.WriteLine(result);
}
//匿名對(duì)象列表插入?必須使用As?顯示指定表名稱
{
????var?list?=?new?List<object>();
????list.Add(new?{?ProductCode?=?"1001",?ProductName?=?"測(cè)試產(chǎn)品1"?});
????list.Add(new?{?ProductCode?=?"1002",?ProductName?=?"測(cè)試產(chǎn)品2"?});
????var?result?=?await?db.Insert(list).As("Product").ExecuteAsync();
????Console.WriteLine(result);
}
//實(shí)體無條件刪除
{
????var?result?=?await?db.Delete().ExecuteAsync();
????Console.WriteLine(result);
}
//實(shí)體條件刪除
{
????var?result?=?await?db.Delete().Where(w?=>?w.ProductId?==?1).ExecuteAsync();
????Console.WriteLine(result);
}
//父類對(duì)象刪除
{
????var?result?=?db.Delete<object>().As("Product").ExecuteAsync();
????Console.WriteLine(result);
}
//匿名對(duì)象條件刪除
{
????var?obj?=?new?{?ProductCode?=?"測(cè)試"?};
????var?result?=?await?db.Delete(obj).Where(w?=>?w.ProductCode?==?obj.ProductCode).As("Product").ExecuteAsync();
????Console.WriteLine(result);
}
//實(shí)體對(duì)象無條件更新
{
????var?result?=?await?db.Update(new?ProductModel()?{?ProductCode?=?"1001",?ProductName?=?"測(cè)試產(chǎn)品1"?}).ExecuteAsync();
????Console.WriteLine(result);
}
//實(shí)體對(duì)象條件更新
{
????var?result?=?await?db.Update(new?ProductModel()?{?ProductCode?=?"1001",?ProductName?=?"測(cè)試產(chǎn)品1"?}).Where(w?=>?w.ProductId?==?1).ExecuteAsync();
????Console.WriteLine(result);
}
//實(shí)體對(duì)象列表更新
{
????var?list?=?new?List();
????for?(int?i?=?0;?i?10;?i++)
????{
????????list.Add(new?ProductModel()?{?ProductId?=?16395?+?i,?ProductCode?=?$"{16395?+?i}",?ProductName?=?$"{16395?+?i}"?});
????}
????var?result?=?await?db.Update(list).ExecuteAsync();
????Console.WriteLine(result);
}
//匿名對(duì)象無條件更新
{
????var?result?=?await?db.Update(new?{?ProductCode?=?"1001",?ProductName?=?"測(cè)試產(chǎn)品1"?}).As("Product").ExecuteAsync();
????Console.WriteLine(result);
}
//匿名對(duì)象條件更新
{
????var?result?=?await?db.Update(new?{?ProductId?=?1,?ProductCode?=?"1001",?ProductName?=?"測(cè)試產(chǎn)品1"?}).Where(w?=>?w.ProductId?==?1).As("Product").ExecuteAsync();
????Console.WriteLine(result);
}
//匿名對(duì)象列表更新?需要顯示指定主鍵名稱
{
????var?list?=?new?List<object>();
????for?(int?i?=?0;?i?10;?i++)
????{
????????list.Add(new?{?ProductId?=?16395?+?i,?ProductCode?=?$"{16395?+?i}",?ProductName?=?$"{16395?+?i}"?});
????}
????var?result?=?await?db.Update(list.ToList()).As("Product").Where("ProductId").ExecuteAsync();
????Console.WriteLine(result);
}
#endregion
#region?查
//返回單個(gè)對(duì)象
{
????var?data?=?await?db.Query().Where(w?=>?w.ProductId?==?1).FirstAsync();
}
//返回列表
{
????var?data?=?await?db.Query().ToListAsync();
}
//返回字典
{
????var?data?=?await?db.Query().DictionaryAsync();
}
//返回字典列表
{
????var?data?=?await?db.Query().DictionaryListAsync();
}
//分頁(yè)查詢
{
????var?data?=?await?db.Query().ToPageListAsync(1,?10);
????Console.WriteLine(JsonSerializer.Serialize(data.Data));//頁(yè)數(shù)據(jù)
????Console.WriteLine($"總數(shù):{data.Count}");
}
//聯(lián)表查詢
{
????var?data?=?await?db.Query().InnerJoin((a,?b)?=>?a.CategoryId?==?b.CategoryId).ToListAsync();
}
//分組查詢
{
????var?data?=?await?db.Query().GroupBy(g?=>?g.ProductName).Select(s?=>?new?{?Count?=?1.Count(),?s.ProductName?}).ToListAsync();
}
//排序查詢
{
????var?data?=?await?db.Query().OrderBy(o?=>?o.ProductName).ToListAsync();
}
//動(dòng)態(tài)條件表達(dá)式
{
????var?obj?=?new?{?ProductName?=?"測(cè)試"?};
????var?ex?=?DynamicWhereExpression.Create().AndIF(!string.IsNullOrWhiteSpace(obj.ProductName),?a?=>?a.ProductName?==?obj.ProductName);
????var?data?=?await?db.Query().Where(ex.Build()).ToListAsync();
}
//?合并查詢
{
????var?query1?=?db.Query().Where(w?=>?w.ProductId?100);
????var?query2?=?db.Query().Where(w?=>?w.ProductId?>?100);
????var?data?=?await?db.UnionAll(query1,?query2).ToListAsync();
}
#endregion
#region?批量復(fù)制?建議數(shù)據(jù)量達(dá)到500以上使用這個(gè)方法?僅支持?SqlServer?MySql?Oracle?PostgreSql
{
????var?list?=?new?List();
????for?(int?i?=?1;?i?<=?10000;?i++)
????{
????????list.Add(new?ProductModel()?{?ProductCode?=?i.ToString(),?ProductName?=?$"測(cè)試{i}"?});
????}
????//?因?yàn)?ProductModel?類還有其它屬性?所以需要使用?Select?擴(kuò)展方法?顯示指定要導(dǎo)入的屬性名稱和表名稱
????var?result?=?await?db.BigData().BulkCopyAsync(list.Select(s?=>?new?{?s.ProductCode,?s.ProductName?}),?"Product");
????Console.WriteLine(result);
}
#endregion
方法太多 寫文檔是個(gè)體力活 更多請(qǐng)看源碼?https://gitee.com/China-Mr-zhong/Fast.Framework
轉(zhuǎn)自:China-Mr-zhong
鏈接:cnblogs.com/China-Mr-zhong/p/15992962.html
