1. 基于.NET 6.0 自研輕量級ORM框架

        共 7088字,需瀏覽 15分鐘

         ·

        2022-05-20 13:37


        Fast Framework

        項目:https://gitee.com/China-Mr-zhong/Fast.Framework

        一、前言

        1、為了實(shí)現(xiàn)快速開發(fā),省去編寫大量Sql時間,更好的面向?qū)ο缶幊逃纱苏Q生了 Fast Framework

        2、Fast Framework 是一個基于.NET 6.0 封裝的輕量級 ORM 框架 支持?jǐn)?shù)據(jù)庫 SqlServer Oracle MySql PostgreSql Sqlite 由于底層使用System.Data.Common 抽象類封裝 理論支持所有Ado.Net 實(shí)現(xiàn)的類庫,差異部分可能需要額外處理。

        3、框架

        優(yōu)點(diǎn):體積小 流暢API 使用更加簡單 性能高

        缺點(diǎn):不具備有自動建庫建表遷移等復(fù)雜的功能 由于不同數(shù)據(jù)庫差異較大 實(shí)現(xiàn)較為復(fù)雜 所以暫時不考慮實(shí)現(xiàn)

        二、項目明細(xì) (后綴為Test均為測試項目)

        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、手動創(chuàng)建

        var?options?=?new?DefaultDbOptions()?//數(shù)據(jù)選項
        ????????????????{
        ????????????????????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ù)庫上下文
        2、依賴注入
        var?builder?=?WebApplication.CreateBuilder(args);

        //?正式項目請用配置文件注入,為了測試方便直接引用實(shí)現(xiàn)類庫

        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)造方法注入已注冊的DbContext對象
        namespace?Fast.Framework.Web.Test.Controllers
        {
        ????[Route("api/[controller]/[action]")]
        ????[ApiController]
        ????public?class?ProductController?:?ControllerBase
        ????{

        ????????///?
        ????????///?數(shù)據(jù)庫
        ????????///?

        ????????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í)體對象插入
        {
        ????var?result?=?await?db.Insert(new?ProductModel()?{?ProductCode?=?"1001",?ProductName?=?"測試產(chǎn)品1"?}).ExecuteAsync();
        ????Console.WriteLine(result);
        }

        //實(shí)體對象插入并返回自增ID?僅支持?SQLServer?Mysql?Sqlite
        {
        ????var?result?=?await?db.Insert(new?ProductModel()?{?ProductCode?=?"1001",?ProductName?=?"測試產(chǎn)品1"?}).ExecuteReturnIdentityAsync();
        ????Console.WriteLine(result);
        }

        //實(shí)體對象列表插入?列表插入不支持批量返回自增ID
        {
        ????var?list?=?new?List();
        ????list.Add(new?ProductModel()?{?ProductCode?=?"1001",?ProductName?=?"測試產(chǎn)品1"?});
        ????list.Add(new?ProductModel()?{?ProductCode?=?"1002",?ProductName?=?"測試產(chǎn)品2"?});
        ????var?result?=?await?db.Insert(list).ExecuteAsync();
        ????Console.WriteLine(result);
        }

        //匿名對象插入?必須使用?As?方法顯示指定表名稱
        {
        ????var?result?=?db.Insert(new?{?ProductCode?=?"1001",?ProductName?=?"測試產(chǎn)品1"?}).As("Product").ExecuteAsync();
        ????Console.WriteLine(result);
        }

        //匿名對象列表插入?必須使用As?顯示指定表名稱
        {
        ????var?list?=?new?List<object>();
        ????list.Add(new?{?ProductCode?=?"1001",?ProductName?=?"測試產(chǎn)品1"?});
        ????list.Add(new?{?ProductCode?=?"1002",?ProductName?=?"測試產(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);
        }

        //父類對象刪除
        {
        ????var?result?=?db.Delete<object>().As("Product").ExecuteAsync();
        ????Console.WriteLine(result);
        }

        //匿名對象條件刪除
        {
        ????var?obj?=?new?{?ProductCode?=?"測試"?};
        ????var?result?=?await?db.Delete(obj).Where(w?=>?w.ProductCode?==?obj.ProductCode).As("Product").ExecuteAsync();
        ????Console.WriteLine(result);
        }

        //實(shí)體對象無條件更新
        {
        ????var?result?=?await?db.Update(new?ProductModel()?{?ProductCode?=?"1001",?ProductName?=?"測試產(chǎn)品1"?}).ExecuteAsync();
        ????Console.WriteLine(result);
        }

        //實(shí)體對象條件更新
        {
        ????var?result?=?await?db.Update(new?ProductModel()?{?ProductCode?=?"1001",?ProductName?=?"測試產(chǎn)品1"?}).Where(w?=>?w.ProductId?==?1).ExecuteAsync();
        ????Console.WriteLine(result);
        }

        //實(shí)體對象列表更新
        {
        ????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);
        }

        //匿名對象無條件更新
        {
        ????var?result?=?await?db.Update(new?{?ProductCode?=?"1001",?ProductName?=?"測試產(chǎn)品1"?}).As("Product").ExecuteAsync();
        ????Console.WriteLine(result);
        }

        //匿名對象條件更新
        {
        ????var?result?=?await?db.Update(new?{?ProductId?=?1,?ProductCode?=?"1001",?ProductName?=?"測試產(chǎn)品1"?}).Where(w?=>?w.ProductId?==?1).As("Product").ExecuteAsync();
        ????Console.WriteLine(result);
        }

        //匿名對象列表更新?需要顯示指定主鍵名稱
        {
        ????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?查

        //返回單個對象
        {
        ????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();
        }

        //分頁查詢
        {
        ????var?data?=?await?db.Query().ToPageListAsync(1,?10);
        ????Console.WriteLine(JsonSerializer.Serialize(data.Data));//頁數(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();
        }

        //動態(tài)條件表達(dá)式
        {
        ????var?obj?=?new?{?ProductName?=?"測試"?};
        ????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以上使用這個方法?僅支持?SqlServer?MySql?Oracle?PostgreSql
        {
        ????var?list?=?new?List();
        ????for?(int?i?=?1;?i?<=?10000;?i++)
        ????{
        ????????list.Add(new?ProductModel()?{?ProductCode?=?i.ToString(),?ProductName?=?$"測試{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
        方法太多 寫文檔是個體力活 更多請看源碼

        ?https://gitee.com/China-Mr-zhong/Fast.Framework


        轉(zhuǎn)自:China-Mr-zhong

        鏈接:cnblogs.com/China-Mr-zhong/p/15992962.html


        瀏覽 22
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
          
          

            1. 啊啊啊啊啊啊好爽 | 国产精品久久99综合免费观看尤物 | 国产精品久久在线观看 | 91狠狠综合久 | 亚洲最新AV无码成人精品区 |