<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框架

          共 15470字,需瀏覽 31分鐘

           ·

          2022-08-09 00:24


          Fast Framework

          項(xiàng)目:https://gitee.com/China-Mr-zhong/Fast.Framework

          一、前言

          1、為了實(shí)現(xiàn)快速開(kāi)發(fā),省去編寫(xiě)大量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 抽象類(lèi)封裝 理論支持所有Ado.Net 實(shí)現(xiàn)的類(lèi)庫(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ì) (后綴為T(mén)est均為測(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

          三、快速入門(mén)

          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<DefaultDbOptions>(options);//原生Ado
                      var db = new DbContext<DefaultDbOptions>(ado);//數(shù)據(jù)庫(kù)上下文
          2、依賴(lài)注入
          var builder = WebApplication.CreateBuilder(args);

          // 正式項(xiàng)目請(qǐng)用配置文件注入,為了測(cè)試方便直接引用實(shí)現(xiàn)類(lèi)庫(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
              {

                  /// <summary>
                  /// 數(shù)據(jù)庫(kù)
                  /// </summary>
                  private readonly IDbContext<DefaultDbOptions> db;

                  /// <summary>
                  /// 日志
                  /// </summary>
                  private readonly ILogger<ProductController> logger;

                  /// <summary>
                  /// 構(gòu)造方法
                  /// </summary>
                  /// <param name="db"></param>
                  public ProductController(ILogger<ProductController> logger, IDbContext<DefaultDbOptions> 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<ProductModel>();
              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 方法顯示指定表名稱(chēng)
          {
              var result = db.Insert(new { ProductCode = "1001", ProductName = "測(cè)試產(chǎn)品1" }).As("Product").ExecuteAsync();
              Console.WriteLine(result);
          }

          //匿名對(duì)象列表插入 必須使用As 顯示指定表名稱(chēng)
          {
              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í)體無(wú)條件刪除
          {
              var result = await db.Delete<ProductModel>().ExecuteAsync();
              Console.WriteLine(result);
          }

          //實(shí)體條件刪除
          {
              var result = await db.Delete<ProductModel>().Where(w => w.ProductId == 1).ExecuteAsync();
              Console.WriteLine(result);
          }

          //父類(lèi)對(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ì)象無(wú)條件更新
          {
              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<ProductModel>();
              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ì)象無(wú)條件更新
          {
              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ì)象列表更新 需要顯示指定主鍵名稱(chēng)
          {
              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<ProductModel>().Where(w => w.ProductId == 1).FirstAsync();
          }

          //返回列表
          {
              var data = await db.Query<ProductModel>().ToListAsync();
          }

          //返回字典
          {
              var data = await db.Query<ProductModel>().DictionaryAsync();
          }

          //返回字典列表
          {
              var data = await db.Query<ProductModel>().DictionaryListAsync();
          }

          //分頁(yè)查詢(xún)
          {
              var data = await db.Query<ProductModel>().ToPageListAsync(110);
              Console.WriteLine(JsonSerializer.Serialize(data.Data));//頁(yè)數(shù)據(jù)
              Console.WriteLine($"總數(shù):{data.Count}");
          }

          //聯(lián)表查詢(xún)
          {
              var data = await db.Query<ProductModel>().InnerJoin<ProductCategoryModel>((a, b) => a.CategoryId == b.CategoryId).ToListAsync();
          }

          //分組查詢(xún)
          {
              var data = await db.Query<ProductModel>().GroupBy(g => g.ProductName).Select(s => new { Count = 1.Count(), s.ProductName }).ToListAsync();
          }

          //排序查詢(xún)
          {
              var data = await db.Query<ProductModel>().OrderBy(o => o.ProductName).ToListAsync();
          }

          //動(dòng)態(tài)條件表達(dá)式
          {
              var obj = new { ProductName = "測(cè)試" };
              var ex = DynamicWhereExpression.Create<ProductModel>().AndIF(!string.IsNullOrWhiteSpace(obj.ProductName), a => a.ProductName == obj.ProductName);

              var data = await db.Query<ProductModel>().Where(ex.Build()).ToListAsync();
          }

          // 合并查詢(xún)
          {
              var query1 = db.Query<ProductModel>().Where(w => w.ProductId < 100);
              var query2 = db.Query<ProductModel>().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<ProductModel>();
              for (int i = 1; i <= 10000; i++)
              {
                  list.Add(new ProductModel() { ProductCode = i.ToString(), ProductName = $"測(cè)試{i}" });
              }
              // 因?yàn)?nbsp;ProductModel 類(lèi)還有其它屬性 所以需要使用 Select 擴(kuò)展方法 顯示指定要導(dǎo)入的屬性名稱(chēng)和表名稱(chēng)
              var result = await db.BigData().BulkCopyAsync(list.Select(s => new { s.ProductCode, s.ProductName }), "Product");
              Console.WriteLine(result);
          }
          #endregion
          方法太多 寫(xiě)文檔是個(gè)體力活 更多請(qǐng)看源碼

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


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

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

          瀏覽 79
          點(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>
                  狠狠搞视频 | 伊人sv| 亚洲精品无码视频 | 狠狠干狠狠艹 | a黄网站 操逼超碰 |