老司机91精品网站在线观看_久久69精品久久久久久hb_成人欧美在线观看_免费一级日本c片完整版

首頁>上市公司 > 正文

今日熱聞!自研ORM (匠心之作)

2023-06-30 15:04:36    出處:博客園
Fast Framework

作者 Mr-zhong


(資料圖片僅供參考)

代碼改變世界....

一、前言

Fast Framework 基于NET6.0 封裝的輕量級 ORM 框架 支持多種數據庫 SqlServer Oracle MySql PostgreSql Sqlite

優點: 體積小、可動態切換不同實現類庫、原生支持微軟特性、流暢API、使用簡單、性能高、模型數據綁定采用 委托、強大的表達式解析、支持多種子查詢可實現較為復雜查詢、源代碼可讀性強。

缺點:目前僅支持Db Frist Code Frist 后續迭代。

開源地址:https://github.com/China-Mr-zhong/Fast-Framework (唯一)

框架經受住了生產項目的考驗,穩定運行中。

二、項目明細
名稱說明
Fast.Framework框架主項目
Fast.Framework.Logging基于微軟接口實現的文件日志(非必要可不引用)
Fast.Framework.Test控制臺測試項目
Fast.Framework.UnitTest單元測試項目
Fast.Framework.Web.TestWeb測試項目
三、核心對象

Ado

IAdo ado = new AdoProvider(new DbOptions()                {                    DbId = "1",                    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;"                });

DbContext 支持多租戶 支持切換不同Ado實現類庫 設置 ProviderName和FactoryName 即可

IDbContext db = new DbContext(new List() {                new DbOptions()                {                    DbId = "1",                    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;"                }});

DbOptions Json文件配置格式

"DbOptions": [    {      "DbId": 1,      "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=120;"    }]

主從分離(讀寫分離)配置

"DbOptions": [    {      "DbId": 2,      "DbType": "MySQL",      "IsDefault": true,      "ProviderName": "MySqlConnector",      "FactoryName": "MySqlConnector.MySqlConnectorFactory,MySqlConnector",      "ConnectionStrings": "server=localhost;database=Test;user=root;pwd=123456789;port=3306;min pool size=0;max pool size=100;connect timeout=120;AllowLoadLocalInfile=true;",      "UseMasterSlaveSeparation": true,//使用主從分離 注意所有事務將強制走主庫      "SlaveItems": [        {          "Weight": 1,//注意多個從庫 必須配置權重且總權重>從庫數          "ConnectionStrings": "server=localhost;database=Test1;user=root;pwd=123456789;port=3306;min pool size=0;max pool size=100;connect timeout=120;AllowLoadLocalInfile=true;",          "Description": "從庫連接配置"        },        {          "Weight": 2,          "ConnectionStrings": "server=localhost;database=Test2;user=root;pwd=123456789;port=3306;min pool size=0;max pool size=100;connect timeout=120;AllowLoadLocalInfile=true;",          "Description": "從庫連接配置"        }      ],      "Description": "主庫連接配置"    }  ]

Asp.net Core 依賴注入

// 注冊服務 var builder = WebApplication.CreateBuilder(args);// 添加數據庫上下文builder.Services.AddFastDbContext();// 從Json配置文件加載數據庫選項builder.Services.Configure>(builder.Configuration.GetSection("DbOptions"));// 產品服務類 通過構造方法注入public class ProductService{    ///     /// 數據庫    ///     private readonly IDbContext db;    ///     /// 構造方法    ///     /// 數據庫    public ProductService(IDbContext db)    {        this.db = db;    }}
四、插入

實體對象插入

var product = new Product()            {                ProductCode = "1001",                ProductName = "測試商品1"            };            var result = db.Insert(product).Exceute();            Console.WriteLine($"實體對象插入 受影響行數 {result}");

實體對象插入并返回自增ID 僅支持 SQLServer MySQL SQLite

var product = new Product()            {                ProductCode = "1001",                ProductName = "測試產品1"            };            var result = db.Insert(product).ExceuteReturnIdentity();            Console.WriteLine($"實體對象插入 返回自增ID {result}");

實體對象列表插入

var list = new List();            for (int i = 0; i < 2100; i++)            {                list.Add(new Product()                {                    ProductCode = $"編號{i + 1}",                    ProductName = $"名稱{i + 1}"                });            }            var result = db.Insert(list).Exceute();            Console.WriteLine($"實體對象列表插入 受影響行數 {result}");

匿名對象插入

var obj = new            {                ProductCode = "1001",                ProductName = "測試商品1"            };            //注意:需要使用As方法顯示指定表名稱            var result = db.Insert(obj).As("Product").Exceute();            Console.WriteLine($"匿名對象插入 受影響行數 {result}");

匿名對象列表插入

var list = new List();            for (int i = 0; i < 2100; i++)            {                list.Add(new                {                    ProductCode = $"編號{i + 1}",                    ProductName = $"名稱{i + 1}"                });            }            //注意:需要使用As方法顯示指定表名稱            var result = db.Insert(list).As("Product").Exceute();            Console.WriteLine($"匿名對象列表插入 受影響行數 {result}");

字典插入

var product = new Dictionary()            {                {"ProductCode","1001"},                { "ProductName","測試商品1"}            };            var result = db.Insert(product).As("Product").Exceute();            Console.WriteLine($"字典插入 受影響行數 {result}");

字典列表插入

var list = new List>();            for (int i = 0; i < 2100; i++)            {                list.Add(new Dictionary()                {                    {"ProductCode","1001"},                    { "ProductName","測試商品1"}                 });            }            var result = db.Insert(list).As("Product").Exceute();            Console.WriteLine($"字典列表插入 受影響行數 {result}");
五、刪除

實體對象刪除

var product = new Product()            {                ProductId = 1,                ProductCode = "1001",                ProductName = "測試商品1"            };            //注意:必須標記KeyAuttribute特性 否則將拋出異常            var result = db.Delete(product).Exceute();            Console.WriteLine($"實體刪除 受影響行數 {result}");

無條件刪除

var result = db.Delete().Exceute();            Console.WriteLine($"無條件刪除 受影響行數 {result}");

表達式刪除

var result = await db.Delete().Where(w => w.ProductId == 1).ExceuteAsync();            Console.WriteLine($"條件刪除 受影響行數 {result}");

特殊刪除

//特殊用法 如需單個條件或多個可搭配 WhereColumn或WhereColumns方法            var result = await db.Delete().As("Product").ExceuteAsync();            Console.WriteLine($"無實體刪除 受影響行數 {result}");六、更新

實體對象更新

var product = new Product()            {                ProductId = 1,                ProductCode = "1001",                ProductName = "測試商品1"            };            //注意:標記KeyAuttribute特性屬性或使用Where條件,為了安全起見全表更新將必須使用Where方法            var result = db.Update(product).Exceute();            Console.WriteLine($"對象更新 受影響行數 {result}");

指定列更新

var result = db.Update(new Product() { ProductCode = "1001", ProductName = "1002" }).Columns(c=> new { c.ProductCode , c.ProductName }).Exceute();// 推薦使用表達式 c=>new {} 好處更改屬性名稱可以同步修改

忽略列更新

var result = db.Update(new Product() { ProductCode = "1001", ProductName = "1002" }).IgnoreColumns(c=> new { c.Custom1 }).Exceute();            // 同上使用方法一樣

實體對象列表更新

var list = new List();            for (int i = 0; i < 2022; i++)            {                list.Add(new Product()                {                    ProductCode = $"編號{i + 1}",                    ProductName = $"名稱{i + 1}"                });            }            //注意:標記KeyAuttribute特性屬性或使用WhereColumns方法指定更新條件列            var result = db.Update(list).Exceute();            Console.WriteLine($"對象列表更新 受影響行數 {result}");

匿名對象更新

var obj = new            {                ProductId = 1,                ProductCode = "1001",                ProductName = "測試商品1"            };            //注意:需要顯示指定表名稱 以及更新條件 使用 Where或者WhereColumns方法均可            var result = db.Update(obj).As("product").WhereColumns("ProductId").Exceute();            Console.WriteLine($"匿名對象更新 受影響行數 {result}");

匿名對象列表更新

var list = new List();            for (int i = 0; i < 2022; i++)            {                list.Add(new                {                    ProductId = i + 1,                    ProductCode = $"編號{i + 1}",                    ProductName = $"名稱{i + 1}"                });            }            //由于是匿名對象需要顯示指定表名稱,使用WhereColumns方法指定更新條件列            var result = db.Update(list).As("Product").WhereColumns("ProductId").Exceute();            Console.WriteLine($"匿名對象列表更新 受影響行數 {result}");

字典更新

var product = new Dictionary()            {                { "ProductId",1},                {"ProductCode","1001"},                { "ProductName","測試商品1"}            };            var result = db.Update(product).As("Product").WhereColumns("ProductId").Exceute();            Console.WriteLine($"字典更新 受影響行數 {result}");

字典列表更新

var list = new List>();            for (int i = 0; i < 2022; i++)            {                list.Add(new Dictionary()                {                    { "ProductId",i+1},                    {"ProductCode",$"更新編號:{i+1}"},                    { "ProductName",$"更新商品:{i + 1}"}                });            }            var result = db.Update(list).As("Product").WhereColumns("ProductId").Exceute();            Console.WriteLine($"字典列表更新 受影響行數 {result}");

指定條件更新

var product = new Product()            {                ProductId = 1,                ProductCode = "1001",                ProductName = "測試商品1"            };            var result = db.Update(product).Where(p => p.ProductId == 100).Exceute();            Console.WriteLine($"表達式更新 受影響行數 {result}");

并發更新 樂觀鎖-版本控制

//注意:僅支持非列表更新 版本列數據類型僅支持 object、string、Guid 時間類型存在精度丟失所以不做支持var obj = db.Query().Where(w => w.ProductId == 1).Frist();                obj.Custom1 = "測試版本控制修改";//參數為 true 更新失敗將拋出異常                var result = db.Update(obj).ExceuteWithOptLock(true);
七、查詢

單一查詢

var data = db.Query().First();

列表查詢

var data = db.Query().ToList();

返回單個字典

var data = db.Query().ToDictionary();

返回字典列表

var data = db.Query().ToDictionaryList();

分頁查詢

//分頁查詢不返回總數            var data = db.Query().ToPageList(1,100);            //分頁查詢返回總數var total = 0;//定義總數變量var data = db.Query().ToPageList(1, 1, ref total);            Console.WriteLine($"總數:{total}");

計數查詢

var data = db.Query().Count();

任何查詢

var data = db.Query().Any();

條件查詢

var data = db.Query().Where(w => w.ProductId == 1).ToList;

Like 查詢

var data = db.Query().Where(w => w.ProductName.StartsWith("左模糊") || w.ProductName.EndsWith("右模糊") || w.ProductName.Contains("全模糊")).ToList();

Not Like查詢

var data = db.Query().Where(w => !w.ProductName.StartsWith("左模糊") || !w.ProductName.EndsWith("右模糊") || !w.ProductName.Contains("全模糊")).ToList();

Select查詢 (選擇字段)

var data = db.Query().Select(s => new            {                s.ProductId,                s.ProductName            }).ToList();

Select查詢 (Case When)

var data = db.Query().Select(s => new                {                    CaseTest1 = SqlFunc.Case(s.Custom1).When("1").Then("xx1").When("2").Then("xx2").Else("xx3").End(),                    CaseTest2 = SqlFunc.CaseWhen(s.Custom1 == "1").Then("xx1").When(s.Custom1 == "2").Then("xx2").Else("xx3").End()                }).ToList();

分組查詢

var data = db.Query().GroupBy(s => new            {                s.ProductId,                s.ProductName            }).ToList();

分組聚合查詢

var sql = db.Query().InnerJoin((a, b) => a.OrderId == b.OrderId).GroupBy((a, b) => new            {                a.OrderCode            }).Select((a, b) => new            {                a.OrderCode,                Sum_Qty = SqlFunc.Sum(b.Qty)//支持嵌套            }).ToList();

排序查詢

var data = db.Query().OrderBy(s => new            {                s.CreateTime            }).ToList();            //這是多個字段排序使用方法 還有其它重載方法

Having查詢

var data = db.Query().GroupBy(s => new            {                s.ProductId,                s.ProductName            }).Having(s => SqlFunc.Count(s.ProductId) > 1).ToList();            //必須先使用GroupBy方法 懂得都懂

聯表查詢

var data = db.Query().LeftJoin((a, b) => a.ProductId == b.ProductId).ToList();            // 右連接 RightJoin 內連接 InnerJoin 全連接 FullJoin

聯合查詢

var query1 = db.Query();            var query2 = db.Query();            db.Union(query1, query2);//聯合            db.UnionAll(query1, query2);//全聯合            //執行查詢調用Toxx方法

導航查詢 (支持無限層級)

///                 /// 類別                ///                 public class Category                {                    ///                     /// 類別ID                    ///                     [Key]                    public int CategoryId { get; set; }                                    ///                     /// 類別名稱                    ///                     public string CategoryName { get; set; }                                    ///                     /// 產品 Navigate MainName和ChildName 可不顯示指定,會自動查找主鍵匹配或ID為結尾的屬性                    ///                     [Navigate(MainName = nameof(CategoryId), ChildName = nameof(Product.CategoryId))]                    public IEnumerable Products { get; set; }                                }                var data = db.Query()                    .Include(i => i.Products)                    .ThenInclude(i => i.Category)                    .ToList();

查詢并插入 僅支持同實例的數據庫 跨庫 個人還是建議 用事務分開寫查詢和插入

//方式1                var result1 = db.Query().Where(w => w.ProductId == 1489087).Select(s => new                {                    s.ProductCode,                    s.ProductName                }).Insert(p => new                {                    p.ProductCode,                    p.ProductName                });                //方式2                var result2 = db.Query().Where(w => w.ProductId == 1489087).Select(s => new                {                    s.ProductCode,                    s.ProductName                }).Insert("表名稱 同實例不同庫 可以使用 db.數據庫名稱.表名稱 ", "列名稱1", "列名稱2");                //方式3 需要注意同方式2 一樣                var result3 = db.Query().Where(w => w.ProductId == 1489087).Select(s => new                {                    s.ProductCode,                    s.ProductName                }).Insert("表名稱 同實例不同庫 可以使用 db.數據庫名稱.表名稱 ", new List() { "列名稱1" });

In查詢

var data1 = db.Query().Where(w => new List(){"1001", "1002"}.Contains(w.ProductCode)).ToList();

Select嵌套查詢和子查詢

var data1 = db.Query().Select(s => new                {                    XX = db.Query().Select(s => 1).First()//需調用返回結果的方法 否則無法解析                }).First();//進價用法,下面示例方法的重載均支持                var query = db.Query().Select(s => new                {                    WithAttr_First = db.QueryWithAttr().First(),                    WithAttr_FirstAsync = db.QueryWithAttr().FirstAsync(),                    WithAttr_ToList = db.QueryWithAttr().ToList(),                    WithAttr_ToListAsync = db.QueryWithAttr().ToListAsync(),                    First_1 = db.Query().Select(s => 1).First(),//解析成Sql                    First = db.Query().First(),                    FirstAsync = db.Query().FirstAsync(),                    ToArray = db.Query().ToArray(),                    ToArrayAsync = db.Query().ToArrayAsync(),                    ToList = db.Query().ToList(),                    ToListAsync = db.Query().ToListAsync(),                    ToPageList = db.Query().ToPageList(1, 10),                    ToPageListAsync = db.Query().ToPageListAsync(1, 10),                    ToPageList_Count = db.Query().ToPageList(1, 10, ref count),                    ToPageListAsync_Count = db.Query().ToPageListAsync(1, 10, refAsync),                    ToDictionary = db.Query().ToDictionary(),                    ToDictionaryAsync = db.Query().ToDictionaryAsync(),                    ToDictionaryList = db.Query().ToDictionaryList(),                    ToDictionaryListAsync = db.Query().ToDictionaryListAsync(),                    ToDictionaryPageList = db.Query().ToDictionaryPageList(1, 10),                    ToDictionaryPageListAsync = db.Query().ToDictionaryPageListAsync(1, 10),                    ToDictionaryPageList_Count = db.Query().ToDictionaryPageList(1, 10, ref count),                    ToDictionaryPageListAsync_Count = db.Query().ToDictionaryPageListAsync(1, 10, refAsync),                    ToDataTable = db.Query().ToDataTable(),                    ToDataTableAsync = db.Query().ToDataTableAsync(),                    ObjToJson = db.Query().ObjToJson(),                    ObjToJsonAsync = db.Query().ObjToJsonAsync(),                    ObjListToJson = db.Query().ObjListToJson(),                    ObjListToJsonAsync = db.Query().ObjListToJsonAsync(),                    Max = db.Query().Max(a => a.CategoryId),//解析成Sql                    MaxAsync = db.Query().MaxAsync(a => a.CategoryId),                    Min = db.Query().Min(a => a.CategoryId),//解析成Sql                    MinAsync = db.Query().MinAsync(a => a.CategoryId),                    Count = db.Query().Count(),//解析成Sql                    CountAsync = db.Query().CountAsync(),                    Sum = db.Query().Sum(s => s.CategoryId),//解析成Sql                    SumAsync = db.Query().SumAsync(s => s.CategoryId),                    Avg = db.Query().Avg(s => s.CategoryId),//解析成Sql                    AvgAsync = db.Query().AvgAsync(s => s.CategoryId)                });var data2= query.First();

From子查詢

var subQuery = db.Query();                var data = db.Query(subQuery).OrderBy(o => o.ProductCode).ToList();

Join子查詢

var subQuery = db.Query();                var data = db.Query().InnerJoin(subQuery, (a, b) => a.ProductId == b.ProductId).ToList();

Include查詢

// 聯表條件 默認優先匹配主鍵 其次帶有ID結尾的名稱                var data = db.Query().Include(i => i.Products).ToList();

Exists查詢

var data = db.Query()                    .Where(w => db.Query().WhereIF(!string.IsNullOrWhiteSpace("測試"), a => a.ProductId == 1).Select(s => 1).Any())                    .Select(s => new                    {                        s.ProductId,                        s.ProductCode                    }).ToList();

查詢綁定字段(注意 字段必須是公開的,否則綁定外部無法訪問,沒有意義)

//當某些字段需要參與計算并且不返回前端時推薦用字段綁定,無需從A實體轉換到B實體,強烈推薦此方式var data = db.Query().Select(s => new Product()                {                    _xx = s.ProductName                }).First();
八、Lambda表達式

動態表達式 命名空間 Fast.Framework.Utils

var ex = DynamicWhereExp.Create().AndIF(1 == 1, a => a.DeleteMark == true).Build();                var data = db.Query().Where(ex).ToList();

Sql函數 自定義函數 需引入命名空間 Fast.Framework.Utils 使用SqlFunc類

SqlServer

類型轉換

方法名稱解析示例值說明自定義函數
ToStringCONVERT( VARCHAR(255),123)轉換 VARCHAR
ToDateTimeCONVERT( DATETIME,‘2022-09-16’)轉換 DATETIME
ToDecimalCONVERT( DECIMAL(10,6),‘123’)轉換 DECIMAL
ToDoubleCONVERT( NUMERIC(10,6),‘123’)轉換 NUMERIC
ToSingleCONVERT( FLOAT,‘123’)轉換 FLOAT
ToInt32CONVERT( INT,‘123’)轉換 INT
ToInt64CONVERT( BIGINT,‘123’)轉換 BIGINT
ToBooleanCONVERT( BIT,‘1’)轉換 BIT
ToCharCONVERT( CHAR(2),"x")轉換 CHAR

聚合函數

方法名稱解析示例值說明自定義函數
MaxMAX( a.[xx] )最大值
MinMIN( a.[xx] )最小值
CountCOUNT( a.[xx] )計數
SumSUM( a.[xx] )合計
AvgAVG( a.[xx] )平均

數學函數

方法名稱解析示例值說明自定義函數
AbsABS( a.[xx] )絕對值
RoundROUND( a.[xx] ,2 )四舍五入

字符串函數

方法名稱解析示例值說明自定義函數
StartsWithLIKE "xx"+‘%’左模糊
EndsWithLIKE ‘%’+"xx"右模糊
ContainsLIKE ‘%’+"xx"+‘%’全模糊
SubStringSUBSTRING( "xxxxxx" ,1,3)截取
ReplaceREPLACE( "xxx","x","y")替換
LenLEN( "xxx" )長度
TrimStartLTRIM( " xx " )修剪起始空格
TrimEndRTRIM( " xx " )修剪末尾空格
ToUpperUPPER( "xx" )大寫
ToLowerLOWER( "xx" )小寫
ConcatCONCAT(a.[xx1],a.[xx2])字符串拼接
Operation[CreateTime] >= @Now_1日期、數值、字符串范圍比較

日期函數

方法名稱解析示例值說明自定義函數
DateDiffDATEDIFF( DAY ,a.[xx],b.[xx])日期相差
AddYearsDATEADD( YEAR,a.[xx],1 )添加年份
AddMonthsDATEADD( MONTH,a.[xx],1 )添加月份
AddDaysDATEADD( DAY,a.[xx],1 )添加天數
AddHoursDATEADD( HOUR,a.[xx],1 )添加時
AddMinutesDATEADD( MINUTE,a.[xx],1 )添加分
AddSecondsDATEADD( SECOND,a.[xx],1 )添加秒
AddMillisecondsDATEADD( MILLISECOND,a.[xx],1 )添加毫秒
YearYEAR( a.[xx] )獲取年份
MonthMONTH( a.[xx] )獲取月份
DayDAY( a.[xx] )獲取天數

其它函數

方法名稱解析示例值說明自定義函數
NewGuidNEWID()獲取GUID
Equalsp.[ProductCode] = "123"比較
IsNullISNULL(a.[xx],0)是否為空
CaseCASEcase
WhenWHENwhen
ThenTHENthen
ElseELSEelse
EndENDend

MySql

類型轉換

方法名稱解析示例值說明自定義函數
ToStringCAST( a.`xx` AS CHAR(510) )轉換 CHAR(510)
ToDateTimeCAST( a.`xx` AS DATETIME )轉換 DATETIME
ToDecimalCAST( a.`xx` AS DECIMAL(10,6) )轉換 DECIMAL(10,6)
ToDoubleCAST( a.`xx` AS DECIMAL(10,6) )轉換 DECIMAL(10,6)
ToInt32CAST( a.`xx` AS DECIMAL(10) )轉換 DECIMAL(10)
ToInt64CAST( a.`xx` AS DECIMAL(19) )轉換 DECIMAL(19)
ToBooleanCAST( a.`xx` AS UNSIGNED )轉換 UNSIGNED
ToCharCAST( a.`xx` AS CHAR(2) )轉換 CHAR(2)

聚合函數

方法名稱解析示例值說明自定義函數
MaxMAX( a.`xx` )最大值
MinMIN( a.`xx` )最小值
CountCOUNT( a.`xx` )計數
SumSUM( a.`xx` )合計
AvgAVG( a.`xx` )平均

數學函數

方法名稱解析示例值說明自定義函數
AbsABS( a.`xx` )絕對值
RoundROUND( a.`xx` ,2 )四舍五入

字符串函數

方法名稱解析示例值說明自定義函數
StartsWithLIKE CONCAT( "xx","%" )左模糊
EndsWithLIKE CONCAT( "%","xx" )右模糊
ContainsLIKE CONCAT( "%","xx","%" )全模糊
SubStringSUBSTRING( "xxxxxx" ,1,3 )截取
ReplaceREPLACE( "xxx","x","y" )替換
LenLEN( "xxx" )長度
TrimTRIM( " xx " )修剪空格
TrimStartLTRIM( " xx " )修剪起始空格
TrimEndRTRIM( " xx " )修剪末尾空格
ToUpperUPPER( "xx" )大寫
ToLowerLOWER( "xx" )小寫
ConcatCONCAT(a.`xx1`,a.`xx2`)字符串拼接
Operation`CreateTime` >= @Now_1日期、數值、字符串范圍比較

日期函數

方法名稱解析示例值說明自定義函數
DateDiffDATEDIFF( a.`xx`,b.`xx` )日期相差 返回相差天數
TimestampDiffTIMESTAMPDIFF( DAY,a.`xx`,b.`xx` )日期相差 指定時間單位
AddYearsDATE_ADD( a.`xx`,INTERVAL 1 YEAR )添加年份
AddMonthsDATE_ADD( a.`xx`,INTERVAL 1 MONTH )添加月份
AddDaysDATE_ADD( a.`xx`,INTERVAL 1 DAY )添加天數
AddHoursDATE_ADD( a.`xx`,INTERVAL 1 HOUR )添加時
AddMinutesDATE_ADD( a.`xx`,INTERVAL 1 MINUTE )添加分
AddSecondsDATE_ADD( a.`xx`,INTERVAL 1 SECOND )添加秒
AddMillisecondsDATE_ADD( a.`xx`,INTERVAL 1 MINUTE_SECOND )添加毫秒
YearYEAR( a.`xx` )獲取年份
MonthMONTH( a.`xx` )獲取月份
DayDAY( a.`xx` )獲取天數

其它函數

方法名稱解析示例值說明自定義函數
NewGuidUUID()獲取GUID
Equalsp.`ProductCode` = "123"比較
IfNullIFNULL( a.`xx`,0 )如果為空
CaseCASEcase
WhenWHENwhen
ThenTHENthen
ElseELSEelse
EndENDend

Oracle

類型轉換

方法名稱解析示例值說明自定義函數
ToStringCAST( a."xx" AS VARCHAR(255) )轉換 VARCHAR
ToDateTimeTO_TIMESTAMP( a."xx" ,"yyyy-MM-dd hh:mi:ss.ff")轉換 DATETIME
ToDecimalCAST( a."xx" AS DECIMAL(10,6) )轉換 DECIMAL
ToDoubleCAST( a."xx" AS NUMBER )轉換 NUMBER
ToSingleCAST( a."xx" AS FLOAT )轉換 FLOAT
ToInt32CAST( a."xx" AS INT )轉換 INT
ToInt64CAST( a."xx" AS NUMBER )轉換 NUMBER
ToBooleanCAST( a."xx" AS CHAR(1) )轉換 CHAR
ToCharCAST( a."xx" AS CHAR(2) )轉換 CHAR

聚合函數

方法名稱解析示例值說明自定義函數
MaxMAX( a."xx" )最大值
MinMIN( a."xx" )最小值
CountCOUNT( a."xx" )計數
SumSUM( a."xx" )合計
AvgAVG( a."xx" )平均

數學函數

方法名稱解析示例值說明自定義函數
AbsABS( a."xx" )絕對值
RoundROUND( a."xx" ,2 )四舍五入

字符串函數

方法名稱解析示例值說明自定義函數
StartsWithLIKE CONCAT( "xx","%" )左模糊
EndsWithLIKE CONCAT( "%","xx" )右模糊
ContainsLIKE CONCAT( "%","xx","%" )全模糊
SubStringSUBSTRING( "xxxxxx" ,1,3)截取
ReplaceREPLACE( "xxx","x","y")替換
LengthLENGTH( "xxx" )長度
TrimStartLTRIM( " xx " )修剪起始空格
TrimEndRTRIM( " xx " )修剪末尾空格
ToUpperUPPER( "xx" )大寫
ToLowerLOWER( "xx" )小寫
ConcatCONCAT(a."xx1",a."xx2")字符串拼接
Operation”CreateTime“ >= @Now_1日期、數值、字符串范圍比較

日期函數

方法名稱解析示例值說明自定義函數
YearEXTRACT( YEAR FROM a."xx" )獲取年份
MonthEXTRACT( MONTH FROM a."xx" )獲取月份
DayEXTRACT( DAY FROM a."xx" )獲取天數

其它函數

方法名稱解析示例值說明自定義函數
Equalsp."ProductCode" = "123"比較
NvlNVL( a."xx",0 )空,默認
CaseCASEcase
WhenWHENwhen
ThenTHENthen
ElseELSEelse
EndENDend

PostgreSql

類型轉換

方法名稱解析示例值說明自定義函數
ToStringa."xx"::VARCHAR(255)轉換 VARCHAR
ToDateTimea."xx"::TIMESTAMP轉換 TIMESTAMP
ToDecimala."xx"::DECIMAL(10,6)轉換 DECIMAL
ToDoublea."xx"::NUMERIC(10,6)轉換 NUMERIC
ToSinglea."xx"::REAL轉換 REAL
ToInt32a."xx"::INTEGER轉換 INT
ToInt64a."xx"::BIGINT轉換 BIGINT
ToBooleana."xx"::BOOLEAN轉換 BOOLEAN
ToChara."xx"::CHAR(2)轉換 CHAR

聚合函數

方法名稱解析示例值說明自定義函數
MaxMAX( a."xx" )最大值
MinMIN( a."xx" )最小值
CountCOUNT( a."xx" )計數
SumSUM( a."xx" )合計
AvgAVG( a."xx" )平均

數學函數

方法名稱解析示例值說明自定義函數
AbsABS( a."xx" )絕對值
RoundROUND( a."xx" ,2 )四舍五入

字符串函數

方法名稱解析示例值說明自定義函數
StartsWithLIKE CONCAT( "%","xx" )左模糊
EndsWithLIKE CONCAT( "xx","%" )右模糊
ContainsLIKE CONCAT( "%","xx","%" )全模糊
SubStringSUBSTRING( "xxxxxx" ,1,3 )截取
ReplaceREPLACE( "xxx","x","y" )替換
LengthLENGTH( "xxx" )長度
TrimTRIM( " xx " )修剪空格
TrimStartLTRIM( " xx " )修剪起始空格
TrimEndRTRIM( " xx " )修剪末尾空格
ToUpperUPPER( "xx" )大寫
ToLowerLOWER( "xx" )小寫
ConcatCONCAT(a."xx1",a."xx2")字符串拼接
Operation”CreateTime“ >= @Now_1日期、數值、字符串范圍比較

日期函數

方法名稱解析示例值說明自定義函數
AddYearsa."xx" + INTERVAL "1 YEAR"添加年份
AddMonthsa."xx" + INTERVAL "1 MONTH"添加月份
AddDaysa."xx" + INTERVAL "1 DAY"添加天數
AddHoursa."xx" + INTERVAL "1 HOUR"添加時
AddMinutesa."xx" + INTERVAL "1 MINUTE"添加分
AddSecondsa."xx" + INTERVAL "1 SECOND"添加秒
AddMillisecondsa."xx" + INTERVAL "1 MINUTE_SECOND"添加毫秒
YearYEAR( a."xx" )獲取年份
MonthMONTH( a."xx" )獲取月份
DayDAY( a."xx" )獲取天數

查詢函數

方法名稱解析示例值說明自定義函數
InIN ( a."xx" ,"x1","x2","x3" )In查詢
NotInNOT IN ( a."xx" ,"x1","x2","x3" )Not In查詢

其它函數

方法名稱解析示例值說明自定義函數
Equalsp.”ProductCode“ = "123"比較
CaseCASEcase
WhenWHENwhen
ThenTHENthen
ElseELSEelse
EndENDend

Sqlite

類型轉換

方法名稱解析示例值說明自定義函數
ToStringCAST(a.[xx] AS TEXT )轉換 TEXT
ToDateTimeDATETIME( a.[xx] )轉換 DateTime
ToDecimalCAST(a.[xx] AS DECIMAL(10,6) )轉換 DECIMAL
ToDoubleCAST(a.[xx] AS NUMERIC(10,6) )轉換 NUMERIC
ToSingleCAST(a.[xx] AS FLOAT )轉換 FLOAT
ToInt32CAST(a.[xx] AS INTEGER )轉換 INTEGER
ToInt64CAST(a.[xx] AS BIGINT )轉換 BIGINT
ToBooleanCAST(a.[xx] AS CHAR(1) )轉換 CHAR
ToCharCAST(a.[xx] AS CHAR(2) )轉換 CHAR

聚合函數

方法名稱解析示例值說明自定義函數
MaxMAX( a.[xx] )最大值
MinMIN( a.[xx] )最小值
CountCOUNT( a.[xx] )計數
SumSUM( a.[xx] )合計
AvgAVG( a.[xx] )平均

數學函數

方法名稱解析示例值說明自定義函數
AbsABS( a.[xx] )絕對值
RoundROUND( a.[xx] ,2 )四舍五入

字符串函數

方法名稱解析示例值說明自定義函數
StartsWithLIKE "xx"||"%"左模糊
EndsWithLIKE "%"||"xx"
ContainsLIKE "%"||"xx"||"%"全模糊
SubStringSUBSTRING( "xxxxxx" ,1,3 )截取
ReplaceREPLACE( "xxx","x","y" )替換
LengthLENGTH( "xxx" )長度
TrimTRIM( " xx " )修剪空格
TrimStartLTRIM( " xx " )修剪起始空格
TrimEndRTRIM( " xx " )修剪末尾空格
ToUpperUPPER( "xx" )大寫
ToLowerLOWER( "xx" )小寫
Operation[CreateTime] >= @Now_1日期、數值、字符串范圍比較

日期函數

方法名稱解析示例值說明自定義函數
AddYearsDATETIME( a.[xx],"1 YEAR" )添加年份
AddMonthsDATETIME( a.[xx],"1 MONTH" )添加月份
AddDaysDATETIME( a.[xx],"1 DAY" )添加天數
AddHoursDATETIME( a.[xx],"1 HOUR" )添加時
AddMinutesDATETIME( a.[xx],"1 MINUTE" )添加分
AddSecondsDATETIME( a.[xx],"1 SECOND" )添加秒
AddMillisecondsDATETIME( a.[xx],"1 YEAR" )添加毫秒
YearSTRFTIME( "%Y", a.[xx] )獲取年份
MonthSTRFTIME( "%m", a.[xx] )獲取月份
DaySTRFTIME( "%j", a.[xx] )獲取天數

其它函數

方法名稱解析示例值說明自定義函數
Equalsp.”ProductCode“ = "123"比較
CaseCASEcase
WhenWHENwhen
ThenTHENthen
ElseELSEelse
EndENDend

添加自定義函數解析

//注意:只能擴展未實現的方法名稱 不能覆蓋原有的實現                Models.DbType.MySQL.AddSqlFunc("方法名稱", (visit, method, sqlStack) =>                {                    //解析邏輯                });
九、數據庫日志
db.Aop.DbLog = (sql, dp) =>                {                    Console.WriteLine($"執行Sql:{sql}");                    if (dp != null)                    {                        foreach (var item in dp)                        {                            Console.WriteLine($"參數名稱:{item.ParameterName} 參數值:{item.ParameterValue}");                        }                    }                };
十、事務

普通事務

try              {                  db.Ado.BeginTran();//開啟事務                  // 執行 CRUD                  db.Ado.CommitTran();//提交事務              }              catch (Exception ex)              {                  Console.WriteLine(ex.Message);                  db.Ado.RollbackTran();//回滾事務              }

更大范圍的事務

try                {                    db.BeginTran();//開啟事務                  // 執行 CRUD                    db.CommitTran();//提交事務                }                catch (Exception ex)                {                    db.RollbackTran();//回滾事務                    Console.WriteLine(ex.Message);                }
十一、多租戶

改變數據庫

//數據庫配置可從Json配置文件加載IDbContext db = new DbContext(new List() {                new DbOptions()                {                    DbId = "1",                    DbType = Models.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=0;max pool size=100;connect timeout=120;"                },                new DbOptions()                {                    DbId = "2",                    DbType = Models.DbType.MySQL,                    ProviderName = "MySqlConnector",                    FactoryName = "MySqlConnector.MySqlConnectorFactory,MySqlConnector",                    ConnectionStrings = "server=localhost;database=Test;user=root;pwd=123456789;port=3306;min pool size=0;max pool size=100;connect timeout=120;"                }});                db.ChangeDb("2");//切換到MySQL
十二、原生特性支持
///     /// 產品    ///     [Table("ProductMain")]    public class Product    {        ///         /// 產品ID        ///         [Key]        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]        public int ProductId { get; set; }        ///         /// 產品編號        ///         [Column("ProductCode")]//不標記默認取當前屬性名稱        public string ProductCode { get; set; }        ///         /// 自定義1        ///         [NotMapped]        public string Custom1 { get; set; }                ///         /// 自定義2        ///         [Column(TypeName="Json")]//類型標記為Json格式對象 匿名對象屬性以及字典值類型 IsClass&&!type.Equals(typeof(string)) 將自動序列化成Json格式        public Category Custom2 { get; set; }    }
十三、原生Ado
// 原始起步                // var conn = db.Ado.DbProviderFactory.CreateConnection();                // var cmd = conn.CreateCommand();                // 封裝的方法分別以Execute和Create開頭以及預處理 PrepareCommand 方法                // 該方法可以自動幫你處理執行的預操作,主要作用是代碼復用。                // 當有非常復雜的查詢 ORM不能滿足需求的時候可以使用原生Ado滿足業務需求                // 構建數據集核心擴展方法 分別有 FristBuild ListBuild DictionaryBuild DictionaryListBuild                var data = db.Ado.ExecuteReader(CommandType.Text, "select * from product", null).ListBuild();
十四、工作單元

注冊數據庫上下文和工作單元服務

var builder = WebApplication.CreateBuilder(args);var configuration = builder.Configuration;// 添加數據庫上下文服務builder.Services.AddFastDbContext();// 添加工作單元服務builder.Services.AddUnitOfWork();// 加載數據庫配置builder.Services.Configure>(configuration.GetSection("DbConfig"));

實際應用

///         /// 工作單元        ///         private readonly IUnitOfWork unitOfWork;        ///         /// 構造方法        ///         /// 工作單元        public UnitOfWorkTestService(IUnitOfWork unitOfWork)        {            this.unitOfWork = unitOfWork;        }        ///         /// 測試        ///         ///         public string Test()        {            //unitOfWork 對象無需顯示使用using            var result1 = unitOfWork.Db.Insert(new Category()            {                CategoryName = "類別3"            }).Exceute();            var result2 = unitOfWork.Db.Insert(new Product()            {                ProductCode = "測試工作單元",            }).Exceute();            unitOfWork.Commit();            return "工作單元執行完成...";        }
十五、大數據導入

批復制 僅支持SqlServer Oracle MySql PostgreSql

var list = new List();                for (int j = 1; j <= 100000; j++)                {                    list.Add(new Product()                    {                        CategoryId = 1,                        ProductCode = $"測試編號_{Timestamp.CurrentTimestampSeconds()}_{j}",                        ProductName = $"測試名稱_{Timestamp.CurrentTimestampSeconds()}_{j}",                        CreateTime = DateTime.Now,                        Custom1 = $"測試自定義1_{Timestamp.CurrentTimestampSeconds()}_{j}",                        Custom2 = $"測試自定義2_{Timestamp.CurrentTimestampSeconds()}_{j}",                        Custom3 = $"測試自定義3_{Timestamp.CurrentTimestampSeconds()}_{j}",                        Custom4 = $"測試自定義4_{Timestamp.CurrentTimestampSeconds()}_{j}",                        Custom5 = $"測試自定義5_{Timestamp.CurrentTimestampSeconds()}_{j}",                        Custom6 = $"測試自定義6_{Timestamp.CurrentTimestampSeconds()}_{j}",                        Custom7 = $"測試自定義7_{Timestamp.CurrentTimestampSeconds()}_{j}",                        Custom8 = $"測試自定義8_{Timestamp.CurrentTimestampSeconds()}_{j}",                        Custom9 = $"測試自定義9_{Timestamp.CurrentTimestampSeconds()}_{j}",                        Custom10 = $"測試自定義10_{Timestamp.CurrentTimestampSeconds()}_{j}",                        Custom11 = $"測試自定義11_{Timestamp.CurrentTimestampSeconds()}_{j}",                        Custom12 = $"測試自定義12_{Timestamp.CurrentTimestampSeconds()}_{j}",                    });                }                db.Fast().BulkCopy(list);

關鍵詞:

消費
產業
抱歉藏不住了!這些年輕車主告訴你,為何種草全新一代瑞虎7 PLUS 都說現在的新青年挑剔、難伺候,100分產品要達到200分品質,才能征服他們的心。其實對于
【新要聞】河口吧租房信息(河口吧) 來為大家解答以上的問題。河口吧租房信息,河口吧這個很多人還不知道,
成都大運會倒計時30天:有序推進競賽組織 具備正賽舉辦條件 世界時訊 中新社成都6月28日電記者28日從第31屆世界大學生夏季運動會(簡稱成都大
【世界新視野】冰糖雪梨銀耳湯的做法大全_冰糖雪梨銀耳湯的做法 1、準備銀耳雪梨湯的配料,包括梨、銀耳、紅棗、枸杞、冰糖、純凈水。2
基金
老司机91精品网站在线观看_久久69精品久久久久久hb_成人欧美在线观看_免费一级日本c片完整版

      国产精品乱人伦中文| 欧美精品一卡二卡| 日韩欧美一区二区在线视频| 中文字幕中文字幕一区二区| 六月丁香婷婷久久| 国产日产欧美精品一区二区三区| 亚洲福利一二三区| 欧美videossexotv100| 一区二区三区蜜桃| 不卡的av在线播放| 亚洲一区二区在线观看视频| 日韩精品一区二区三区视频在线观看| 亚洲精品国产无天堂网2021| 国产精品1024| 伊人开心综合网| 2024国产精品| 热久久国产精品| 久久久久国产精品麻豆ai换脸| 一本久久精品一区二区| 久久久91精品国产一区二区精品| 琪琪一区二区三区| 国产日韩欧美精品电影三级在线| 欧美亚洲动漫精品| 日韩理论片在线| 福利一区二区在线| 亚洲国产精品久久人人爱蜜臀 | 毛片av一区二区| 欧美国产精品一区二区三区| 欧美日韩精品欧美日韩精品一 | 亚洲成人免费观看| 国产三级欧美三级日产三级99| 蜜臀av性久久久久蜜臀av麻豆| 国产欧美va欧美不卡在线| 欧美伦理影视网| 亚洲综合精品自拍| 久久综合色之久久综合| 欧美日韩大陆在线| 天天影视色香欲综合网老头| 国产日产欧美一区| 日韩视频在线你懂得| 日本欧美肥老太交大片| 国产精品久久午夜夜伦鲁鲁| 日韩片之四级片| 蜜臀av一区二区在线观看| 国产精品麻豆网站| 精品国产露脸精彩对白| 久久99久久久久| 一区二区三区四区在线免费观看| 国产亚洲一区二区三区| 国产成人精品在线看| 色老综合老女人久久久| 一区二区三区在线观看网站| 久久五月婷婷丁香社区| 91麻豆精品91久久久久同性| 日韩精品高清不卡| |精品福利一区二区三区| 久久精品夜夜夜夜久久| 国产盗摄精品一区二区三区在线| 色哟哟欧美精品| 亚洲成人综合在线| 国产精品久久久久精k8| 久久亚洲精华国产精华液 | 精品一区二区三区免费观看| 一区二区三区免费看视频| 中文字幕一区日韩精品欧美| 99久久精品免费观看| 欧美一区二区三区在线电影| 蜜桃av一区二区在线观看| 亚洲主播在线观看| 亚洲美女精品一区| 国产精品乱码一区二区三区软件| 久久久午夜电影| 成人av在线观| 欧美一区二区三区精品| 国产一区二区三区国产| 欧美吞精做爰啪啪高潮| 美女一区二区三区在线观看| 色一区在线观看| 日韩电影一区二区三区四区| 亚洲一区二区三区四区在线| 亚洲国产视频一区二区| 亚洲精品久久久蜜桃| 亚洲精品乱码久久久久久日本蜜臀| 欧美极品少妇xxxxⅹ高跟鞋| 国产日产欧美一区| 国产亚洲女人久久久久毛片| 久久久久久久综合色一本| 91啪亚洲精品| 久久久精品2019中文字幕之3| 不卡的av网站| 久久香蕉国产线看观看99| 成人av资源在线观看| 日韩欧美一二三四区| 成人免费视频一区二区| 日韩欧美亚洲一区二区| 成人午夜精品一区二区三区| 日韩一区二区三区观看| jlzzjlzz欧美大全| 久久这里只有精品视频网| 99re成人精品视频| 国产日韩欧美精品一区| 久久精品亚洲精品国产欧美kt∨| 国产日韩亚洲欧美综合| 中文一区在线播放| 亚洲免费在线观看| 一个色在线综合| 日韩中文字幕不卡| 欧美性感一区二区三区| 国产精品一线二线三线| 日韩午夜av电影| 99久久婷婷国产| 欧美国产成人在线| 中文字幕在线不卡国产视频| 亚洲激情五月婷婷| 亚洲第一av色| 美女看a上一区| 欧美一区二区久久| 2020国产精品自拍| 国产精品久久久99| 亚洲精品免费在线观看| 日韩有码一区二区三区| 欧美三区在线观看| 大陆成人av片| 中文字幕一区二区三区在线不卡 | 一区二区在线观看视频| 日韩影院精彩在线| 在线播放中文字幕一区| av亚洲精华国产精华| 国产精品视频一二三区 | 国产欧美一区二区精品性色超碰| 亚洲欧美日韩国产另类专区| 亚洲午夜精品17c| 国产美女视频91| 久久久久久久性| 国产精品午夜电影| 亚洲国产精品自拍| 欧美日韩三级一区| 99免费精品在线| 1024国产精品| 色综合久久久久久久| 国产成人三级在线观看| 国产日韩一级二级三级| 一区二区三区欧美日| 国产一区二区在线电影| 久久精品一区八戒影视| 亚洲精品久久嫩草网站秘色| 久久99精品久久久久久国产越南 | 国产精品日日摸夜夜摸av| 亚洲成人资源在线| 欧美精品一级二级三级| 国产日产欧美一区| 日韩黄色免费电影| 日韩三级av在线播放| 国产精品乱人伦中文| 蜜臀va亚洲va欧美va天堂| 精品福利在线导航| 亚洲精品中文字幕乱码三区 | 中文av一区特黄| 美女一区二区视频| 国产亚洲精品中文字幕| 一区二区三区四区av| 国产成人三级在线观看| 亚洲人亚洲人成电影网站色| 在线免费观看日韩欧美| 26uuu色噜噜精品一区二区| 一区二区三区国产精华| 欧美一区二区三区四区五区| 中文字幕日韩一区| 国产一二三精品| 亚洲色图欧美激情| 欧美精品三级日韩久久| 国产精品久久久久久久蜜臀| 精品一区二区三区影院在线午夜 | 亚洲黄色av一区| 丁香一区二区三区| 一区二区三区在线观看网站| 欧美一区二区三区在线观看| 亚洲欧美色综合| 夫妻av一区二区| 亚洲国产成人porn| www成人在线观看| 天天综合网天天综合色| 26uuu国产一区二区三区| 日韩激情视频在线观看| 久久久久久99精品| 91国模大尺度私拍在线视频| 国产日韩高清在线| 精品一区二区三区视频在线观看| 亚洲欧洲精品成人久久奇米网| 欧美日韩一区 二区 三区 久久精品| 日本一区二区三区国色天香 | 2024国产精品视频| 久久精品国产一区二区| 成人欧美一区二区三区白人| 这里只有精品视频在线观看| 亚洲精品中文在线观看| 91亚洲资源网| 精品一区二区三区在线观看国产| 亚洲老妇xxxxxx| 精品少妇一区二区三区在线播放|