Fast.Framework ORM 試用

来源:https://www.cnblogs.com/s0611163/archive/2022/09/16/16699439.html
-Advertisement-
Play Games

簡介 Fast.Framework 是一款基於 .NET 6 封裝的輕量級ORM框架,支持多種資料庫(SQL Server、Oracle、MySQL、PostgreSQL、SQLite)。 優點 性能好 使用簡單 如何使用 1. 安裝 NuGet搜索Fast.Framework並安裝最新版本 2. ...


簡介

Fast.Framework 是一款基於 .NET 6 封裝的輕量級ORM框架,支持多種資料庫(SQL Server、Oracle、MySQL、PostgreSQL、SQLite)。

優點

  1. 性能好
  2. 使用簡單

如何使用

1. 安裝

NuGet搜索Fast.Framework並安裝最新版本

2. 創建DbContext對象

DbContext是輕量級的,可以頻繁創建,一個線程創建一個DbContext,不要跨線程使用。

private IDbContext GetDbContext()
{
    IDbContext _db = new DbContext(new List<DbOptions>() {
            new DbOptions()
            {
                DbId = "1",
                DbType = DbType.MySQL,
                ProviderName = "MySqlConnector",
                FactoryName = "MySqlConnector.MySqlConnectorFactory,MySqlConnector",
                ConnectionStrings = "Data Source=localhost;Port=3306;User ID=root;Password=123456;Initial Catalog=fast_framework_test;Charset=utf8mb4;SslMode=none;Allow User Variables=True;connection timeout=600;"
            }
        });

    if (_printSql)
    {
        _db.Aop.DbLog = (sql, dp) =>
        {
            Console.WriteLine($"執行Sql:{sql}");
            if (dp != null)
            {
                foreach (var item in dp)
                {
                    Console.WriteLine($"參數名稱:{item.ParameterName} 參數值:{item.Value}");
                }
            }
        };
    }

    return _db;
}

實體類

實體類原生支持微軟特性,相容Entity Framework。

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Models
{
    /// <summary>
    /// 用戶表
    /// </summary>
    [Serializable]
    [Table("sys_user")]
    public partial class SysUser
    {

        /// <summary>
        /// 主鍵
        /// </summary>
        [Key]
        [Column("id")]
        public long Id { get; set; }

        /// <summary>
        /// 用戶名
        /// </summary>
        [Column("user_name")]
        public string UserName { get; set; }

        /// <summary>
        /// 用戶姓名
        /// </summary>
        [Column("real_name")]
        public string RealName { get; set; }

        /// <summary>
        /// 用戶密碼
        /// </summary>
        [Column("password")]
        public string Password { get; set; }

        /// <summary>
        /// 備註
        /// </summary>
        [Column("remark")]
        public string Remark { get; set; }

        /// <summary>
        /// 創建者ID
        /// </summary>
        [Column("create_userid")]
        public string CreateUserid { get; set; }

        /// <summary>
        /// 創建時間
        /// </summary>
        [Column("create_time")]
        public DateTime CreateTime { get; set; }

        /// <summary>
        /// 更新者ID
        /// </summary>
        [Column("update_userid")]
        public string UpdateUserid { get; set; }

        /// <summary>
        /// 更新時間
        /// </summary>
        [Column("update_time")]
        public DateTime? UpdateTime { get; set; }

    }
}

.NET 6 依賴註入FastDbContext

配置文件

"DbConfig": [
  {
    "DbId": 1,
    "DbType": "MySQL",
    "IsDefault": true,
    "ProviderName": "MySqlConnector",
    "FactoryName": "MySqlConnector.MySqlConnectorFactory,MySqlConnector",
    "ConnectionStrings": "Data Source=localhost;Port=3306;User ID=root;Password=123456;Initial Catalog=fast_framework_test;Charset=utf8mb4;SslMode=none;Allow User Variables=True;connection timeout=600;"
  }
]

註入代碼

//註入FastDbContext
builder.Services.Configure<List<DbOptions>>(builder.Configuration.GetSection("DbConfig"));
builder.Services.AddFastDbContext();

迴圈插入

await db.Ado.BeginTranAsync();
foreach (SysUser user in userList)
{
    await db.Insert(user).ExceuteAsync();
}
await db.Ado.CommitTranAsync();

批量插入

await GetDbContext().Insert(userList).ExceuteAsync();

迴圈修改

await db.Ado.BeginTranAsync();
foreach (SysUser user in userList)
{
    await db.Update(user).ExceuteAsync();
}
await db.Ado.CommitTranAsync();

批量修改

await GetDbContext().Update(userList).ExceuteAsync();

條件查詢

Pagination pagination = new Pagination();
pagination.Page = 10;
pagination.PageSize = 200;

var list = await _db.Query<SysUser>()
    .Where(t => t.Id > 20 && t.RealName.Contains("測試"))
    .OrderBy(t => t.CreateTime, "desc")
    .OrderBy(t => t.Id).ToPageListAsync(pagination);

分組聚合統計查詢

這個寫法很優雅。

var list = await db.Query<BsOrderDetail>()
    .LeftJoin<BsOrder>((d, o) => o.Id == d.OrderId)
    .GroupBy((d, o) => new { o.Id, o.OrderTime, o.Remark })
    .Having((d, o) => SqlFunc.Sum(d.Quantity * d.Price) > 1000)
    .Select((d, o) => new
    {
        o.Id,
        o.OrderTime,
        o.Remark,
        Amount = SqlFunc.Sum(d.Quantity * d.Price)
    }).ToListAsync();

性能測試

性能測試使用Winform測試
與其它ORM的對比請參考《ORM增刪改查併發性能測試2

常規測試

併發查詢

併發插入

結論

感覺還是非常快的,性能非常優異。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、什麼是動態SQL 官方文檔給出了這樣的說明: 動態 SQL 是 MyBatis 的強大特性之一。如果你使用過 JDBC 或其它類似的框架,你應該能理解根據不同條件拼接 SQL 語句有多痛苦,例如拼接時要確保不能忘記添加必要的空格,還要註意去掉列表最後一個列名的逗號。利用動態 SQL,可以徹底擺脫 ...
  • 關於面試題,“什麼是鏈路追蹤”? 我們應該怎麼回答呢? 大家好,我是Mic,一個工作了14年的Java程式員 這個問題,面試官想考察什麼呢? 問題解析 鏈路追蹤是分散式架構下的一種監控方式。 對於一些規模較大的分散式系統,一個用戶的請求,可能需要涉及到多個子系統的流轉。 而且隨著業務的不斷增長,服務 ...
  • 一、前言 我們在日常學習中,對一個java代碼有問題,不知道jvm內部怎麼進行解析的時候;有個偉大壯舉就是反編譯,這樣就可以看到jvm內部怎麼進行對這個java文件解析的!我們可以使用JDK自帶的javap命令來進行反編譯,反編譯出來的如果看不太明白,可以使用Jad工具來配合使用。還有就是把jar包 ...
  • 前期準備: 1.phpqrcode類文件下載,下載地址:https://sourceforge.net/projects/phpqrcode/2.PHP環境必須開啟支持GD2擴展庫支持(一般情況下都是開啟狀態) 以下為示例代碼,引入類文件後,調整相應的參數即可調用 1 /** 2 *第1個參數$te ...
  • 在MyBatis的映射中有column這麼一個屬性,我一直以為它映射的是資料庫表中的列名,但經過學習發現他似乎映射的是SQL語句中的列名,或者說是查詢結果所得到的表的列名。 下麵我們進行一個實驗。 首先我們有一張user表: 我還有一個實體類User,有著id、username、password三個 ...
  • 代碼生成器(CodeBuilder) 經過這幾個版本的完善,目前功能也趨於穩定,詳細的線上文檔也得到維護,不失為一款強大的代碼生成工具。 官網:http://www.fireasy.cn/codebuilder 多數據源 資料庫表、欄位和關係等元數據統稱為架構 Schema,它們是生成代碼的源材料。 ...
  • ​ 老婆公司的需求,公司給了一個星期的時間。讓她每天去複製粘貼。然後就有瞭如下代碼: 先說實現吧 一、抓包 Charles https://www.charlesproxy.com/ 打開Charles , 配置好SSL Proxy 。 ​ 編輯 證書OK後,配置允許抓取系統資源: ​ 編輯 啟動抓 ...
  • 1.介紹 泛型中的約束,其實就是針對類型參數的約束,限制類型參數的選擇只能在某個特定範圍內。其中的體現包括:限制類型參數必須是一個結構、限制類型參數必須是某個具體類型、限制類型參數必須派生自某個基類等等。在預設情況下,定義的泛型沒有任何約束,這意味著在調用泛型時,可以使用任何數據類型作為類型參數。如 ...
一周排行
    -Advertisement-
    Play Games
  • 一:背景 1.講故事 在分析的眾多dump中,經常會遇到各種奇葩的問題,僅通過dump這種快照形式還是有很多問題搞不定,而通過 perfview 這種粒度又太粗,很難找到問題之所在,真的很頭疼,比如本篇的 短命線程 問題,參考圖如下: 我們在 t2 時刻抓取的dump對查看 短命線程 毫無幫助,我根 ...
  • 在日常後端Api開發中,我們跟前端的溝通中,通常需要協商好入參的數據類型,和參數是通過什麼方式存在於請求中的,是表單(form)、請求體(body)、地址欄參數(query)、還是說通過請求頭(header)。 當協商好後,我們的介面又需要怎麼去接收這些數據呢?很多小伙伴可能上手就是直接寫一個實體, ...
  • 許多情況下我們需要用到攝像頭獲取圖像,進而處理圖像,這篇博文介紹利用pyqt5、OpenCV實現用電腦上連接的攝像頭拍照並保存照片。為了使用和後續開發方便,這裡利用pyqt5設計了個相機界面,後面將介紹如何實現,要點包括界面設計、邏輯實現及完整代碼。 ...
  • 思路分析 註冊頁面需要對用戶提交的數據進行校驗,並且需要對用戶輸入錯誤的地方進行提示! 所有我們需要使用forms組件搭建註冊頁面! 平時我們書寫form是組件的時候是在views.py裡面書寫的, 但是為了接耦合,我們需要將forms組件都單獨寫在一個地方,需要用的時候導入就行! 例如,在項目文件 ...
  • 思路分析 登錄頁面,我們還是採用ajax的方式提交用戶數據 唯一需要學習的是如何製作圖片驗證碼! 具體的登錄頁面效果圖如下: 如何製作圖片驗證碼 推導步驟1:在img標簽的src屬性里放上驗證碼的請求路徑 補充1.img的src屬性: 1.圖片路徑 2.url 3.圖片的二進位數據 補充2:字體樣式 ...
  • 哈嘍,兄弟們! 最近有許多小伙伴都在吐槽打工好難。 每天都是執行許多重覆的任務 例如閱讀新聞、發郵件、查看天氣、打開書簽、清理文件夾等等, 使用自動化腳本,就無需手動一次又一次地完成這些任務, 非常方便啊有木有?! 而在某種程度上,Python 就是自動化的代名詞。 今天就來和大家一起學習一下, 用 ...
  • 作者:IT王小二 博客:https://itwxe.com 前面小二介紹過使用Typora+PicGo+LskyPro打造舒適寫作環境,那時候需要使用水印功能,但是小二在升級LskyPro2.x版本發現有很多不如人意的東西,遂棄用LskyPro使用MinIO結合代碼實現自己需要的圖床功能,也適合以後 ...
  • OpenAI Gym是一款用於研發和比較強化學習演算法的工具包,本文主要介紹Gym模擬環境的功能和工具包的使用方法,並詳細介紹其中的經典控制問題中的倒立擺(CartPole-v0/1)問題。最後針對倒立擺問題如何建立控制模型並採用爬山演算法優化進行了介紹,並給出了相應的完整python代碼示例和解釋。要... ...
  • python爬蟲瀏覽器偽裝 #導入urllib.request模塊 import urllib.request #設置請求頭 headers=("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, l ...
  • 前端代碼搭建 主要利用的是bootstrap3中js插件里的模態框版塊 <li><a href="" data-toggle="modal" data-target=".bs-example-modal-lg">修改密碼</a></li> <div class="modal fade bs-exam ...