<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于.NET 6.0 自研輕量級(jí)ORM框架

          共 7088字,需瀏覽 15分鐘

           ·

          2022-05-20 13:37


          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


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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美三级成人片 | 2020天天干天天操 | 日本国产在线 | 亚洲大香| 欧美性爱免费网址 |