作者 Mr-zhong
(資料圖片僅供參考)
代碼改變世界....
一、前言Fast Framework 基于NET6.0 封裝的輕量級(jí) ORM 框架 支持多種數(shù)據(jù)庫(kù) SqlServer Oracle MySql PostgreSql Sqlite
優(yōu)點(diǎn): 體積小、可動(dòng)態(tài)切換不同實(shí)現(xiàn)類庫(kù)、原生支持微軟特性、流暢API、使用簡(jiǎn)單、性能高、模型數(shù)據(jù)綁定采用 委托、強(qiáng)大的表達(dá)式解析、支持多種子查詢可實(shí)現(xiàn)較為復(fù)雜查詢、源代碼可讀性強(qiáng)。
缺點(diǎn):目前僅支持Db Frist Code Frist 后續(xù)迭代。
開(kāi)源地址:https://github.com/China-Mr-zhong/Fast-Framework (唯一)
框架經(jīng)受住了生產(chǎn)項(xiàng)目的考驗(yàn),穩(wěn)定運(yùn)行中。
二、項(xiàng)目明細(xì)| 名稱 | 說(shuō)明 |
|---|---|
| Fast.Framework | 框架主項(xiàng)目 |
| Fast.Framework.Logging | 基于微軟接口實(shí)現(xiàn)的文件日志(非必要可不引用) |
| Fast.Framework.Test | 控制臺(tái)測(cè)試項(xiàng)目 |
| Fast.Framework.UnitTest | 單元測(cè)試項(xiàng)目 |
| Fast.Framework.Web.Test | Web測(cè)試項(xiàng)目 |
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實(shí)現(xiàn)類庫(kù) 設(shè)置 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,//使用主從分離 注意所有事務(wù)將強(qiáng)制走主庫(kù) "SlaveItems": [ { "Weight": 1,//注意多個(gè)從庫(kù) 必須配置權(quán)重且總權(quán)重>從庫(kù)數(shù) "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": "從庫(kù)連接配置" }, { "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": "從庫(kù)連接配置" } ], "Description": "主庫(kù)連接配置" } ]Asp.net Core 依賴注入
// 注冊(cè)服務(wù) var builder = WebApplication.CreateBuilder(args);// 添加數(shù)據(jù)庫(kù)上下文builder.Services.AddFastDbContext();// 從Json配置文件加載數(shù)據(jù)庫(kù)選項(xiàng)builder.Services.Configure>(builder.Configuration.GetSection("DbOptions"));// 產(chǎn)品服務(wù)類 通過(guò)構(gòu)造方法注入public class ProductService{ /// /// 數(shù)據(jù)庫(kù) /// private readonly IDbContext db; /// /// 構(gòu)造方法 /// /// 數(shù)據(jù)庫(kù) public ProductService(IDbContext db) { this.db = db; }}
四、插入實(shí)體對(duì)象插入
var product = new Product() { ProductCode = "1001", ProductName = "測(cè)試商品1" }; var result = db.Insert(product).Exceute(); Console.WriteLine($"實(shí)體對(duì)象插入 受影響行數(shù) {result}");實(shí)體對(duì)象插入并返回自增ID 僅支持 SQLServer MySQL SQLite
var product = new Product() { ProductCode = "1001", ProductName = "測(cè)試產(chǎn)品1" }; var result = db.Insert(product).ExceuteReturnIdentity(); Console.WriteLine($"實(shí)體對(duì)象插入 返回自增ID {result}");實(shí)體對(duì)象列表插入
var list = new List(); for (int i = 0; i < 2100; i++) { list.Add(new Product() { ProductCode = $"編號(hào){i + 1}", ProductName = $"名稱{i + 1}" }); } var result = db.Insert(list).Exceute(); Console.WriteLine($"實(shí)體對(duì)象列表插入 受影響行數(shù) {result}"); 匿名對(duì)象插入
var obj = new { ProductCode = "1001", ProductName = "測(cè)試商品1" }; //注意:需要使用As方法顯示指定表名稱 var result = db.Insert(obj).As("Product").Exceute(); Console.WriteLine($"匿名對(duì)象插入 受影響行數(shù) {result}");匿名對(duì)象列表插入
var list = new List字典插入
var product = new Dictionary() { {"ProductCode","1001"}, { "ProductName","測(cè)試商品1"} }; var result = db.Insert(product).As("Product").Exceute(); Console.WriteLine($"字典插入 受影響行數(shù) {result}"); 字典列表插入
var list = new List>(); for (int i = 0; i < 2100; i++) { list.Add(new Dictionary() { {"ProductCode","1001"}, { "ProductName","測(cè)試商品1"} }); } var result = db.Insert(list).As("Product").Exceute(); Console.WriteLine($"字典列表插入 受影響行數(shù) {result}"); 五、刪除實(shí)體對(duì)象刪除
var product = new Product() { ProductId = 1, ProductCode = "1001", ProductName = "測(cè)試商品1" }; //注意:必須標(biāo)記KeyAuttribute特性 否則將拋出異常 var result = db.Delete(product).Exceute(); Console.WriteLine($"實(shí)體刪除 受影響行數(shù) {result}");無(wú)條件刪除
var result = db.Delete().Exceute(); Console.WriteLine($"無(wú)條件刪除 受影響行數(shù) {result}"); 表達(dá)式刪除
var result = await db.Delete().Where(w => w.ProductId == 1).ExceuteAsync(); Console.WriteLine($"條件刪除 受影響行數(shù) {result}"); 特殊刪除
//特殊用法 如需單個(gè)條件或多個(gè)可搭配 WhereColumn或WhereColumns方法 var result = await db.Delete六、更新實(shí)體對(duì)象更新
var product = new Product() { ProductId = 1, ProductCode = "1001", ProductName = "測(cè)試商品1" }; //注意:標(biāo)記KeyAuttribute特性屬性或使用Where條件,為了安全起見(jiàn)全表更新將必須使用Where方法 var result = db.Update(product).Exceute(); Console.WriteLine($"對(duì)象更新 受影響行數(shù) {result}");指定列更新
var result = db.Update(new Product() { ProductCode = "1001", ProductName = "1002" }).Columns(c=> new { c.ProductCode , c.ProductName }).Exceute();// 推薦使用表達(dá)式 c=>new {} 好處更改屬性名稱可以同步修改 忽略列更新
var result = db.Update(new Product() { ProductCode = "1001", ProductName = "1002" }).IgnoreColumns(c=> new { c.Custom1 }).Exceute(); // 同上使用方法一樣 實(shí)體對(duì)象列表更新
var list = new List(); for (int i = 0; i < 2022; i++) { list.Add(new Product() { ProductCode = $"編號(hào){i + 1}", ProductName = $"名稱{i + 1}" }); } //注意:標(biāo)記KeyAuttribute特性屬性或使用WhereColumns方法指定更新條件列 var result = db.Update(list).Exceute(); Console.WriteLine($"對(duì)象列表更新 受影響行數(shù) {result}"); 匿名對(duì)象更新
var obj = new { ProductId = 1, ProductCode = "1001", ProductName = "測(cè)試商品1" }; //注意:需要顯示指定表名稱 以及更新條件 使用 Where或者WhereColumns方法均可 var result = db.Update(obj).As("product").WhereColumns("ProductId").Exceute(); Console.WriteLine($"匿名對(duì)象更新 受影響行數(shù) {result}");匿名對(duì)象列表更新
var list = new List字典更新
var product = new Dictionary() { { "ProductId",1}, {"ProductCode","1001"}, { "ProductName","測(cè)試商品1"} }; var result = db.Update(product).As("Product").WhereColumns("ProductId").Exceute(); Console.WriteLine($"字典更新 受影響行數(shù) {result}"); 字典列表更新
var list = new List>(); for (int i = 0; i < 2022; i++) { list.Add(new Dictionary() { { "ProductId",i+1}, {"ProductCode",$"更新編號(hào):{i+1}"}, { "ProductName",$"更新商品:{i + 1}"} }); } var result = db.Update(list).As("Product").WhereColumns("ProductId").Exceute(); Console.WriteLine($"字典列表更新 受影響行數(shù) {result}"); 指定條件更新
var product = new Product() { ProductId = 1, ProductCode = "1001", ProductName = "測(cè)試商品1" }; var result = db.Update(product).Where(p => p.ProductId == 100).Exceute(); Console.WriteLine($"表達(dá)式更新 受影響行數(shù) {result}");并發(fā)更新 樂(lè)觀鎖-版本控制
//注意:僅支持非列表更新 版本列數(shù)據(jù)類型僅支持 object、string、Guid 時(shí)間類型存在精度丟失所以不做支持var obj = db.Query().Where(w => w.ProductId == 1).Frist(); obj.Custom1 = "測(cè)試版本控制修改";//參數(shù)為 true 更新失敗將拋出異常 var result = db.Update(obj).ExceuteWithOptLock(true); 七、查詢單一查詢
var data = db.Query().First(); 列表查詢
var data = db.Query().ToList(); 返回單個(gè)字典
var data = db.Query().ToDictionary(); 返回字典列表
var data = db.Query().ToDictionaryList(); 分頁(yè)查詢
//分頁(yè)查詢不返回總數(shù) var data = db.Query().ToPageList(1,100); //分頁(yè)查詢返回總數(shù)var total = 0;//定義總數(shù)變量var data = db.Query().ToPageList(1, 1, ref total); Console.WriteLine($"總數(shù):{total}"); 計(jì)數(shù)查詢
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(); //這是多個(gè)字段排序使用方法 還有其它重載方法 Having查詢
var data = db.Query().GroupBy(s => new { s.ProductId, s.ProductName }).Having(s => SqlFunc.Count(s.ProductId) > 1).ToList(); //必須先使用GroupBy方法 懂得都懂 聯(lián)表查詢
var data = db.Query().LeftJoin((a, b) => a.ProductId == b.ProductId).ToList(); // 右連接 RightJoin 內(nèi)連接 InnerJoin 全連接 FullJoin 聯(lián)合查詢
var query1 = db.Query(); var query2 = db.Query(); db.Union(query1, query2);//聯(lián)合 db.UnionAll(query1, query2);//全聯(lián)合 //執(zhí)行查詢調(diào)用Toxx方法 導(dǎo)航查詢 (支持無(wú)限層級(jí))
/// /// 類別 /// public class Category { /// /// 類別ID /// [Key] public int CategoryId { get; set; } /// /// 類別名稱 /// public string CategoryName { get; set; } /// /// 產(chǎn)品 Navigate MainName和ChildName 可不顯示指定,會(huì)自動(dòng)查找主鍵匹配或ID為結(jié)尾的屬性 /// [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(); 查詢并插入 僅支持同實(shí)例的數(shù)據(jù)庫(kù) 跨庫(kù) 個(gè)人還是建議 用事務(wù)分開(kāi)寫查詢和插入
//方式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("表名稱 同實(shí)例不同庫(kù) 可以使用 db.數(shù)據(jù)庫(kù)名稱.表名稱 ", "列名稱1", "列名稱2"); //方式3 需要注意同方式2 一樣 var result3 = db.Query().Where(w => w.ProductId == 1489087).Select(s => new { s.ProductCode, s.ProductName }).Insert("表名稱 同實(shí)例不同庫(kù) 可以使用 db.數(shù)據(jù)庫(kù)名稱.表名稱 ", 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()//需調(diào)用返回結(jié)果的方法 否則無(wú)法解析 }).First();//進(jìn)價(jià)用法,下面示例方法的重載均支持 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查詢
// 聯(lián)表?xiàng)l件 默認(rèn)優(yōu)先匹配主鍵 其次帶有ID結(jié)尾的名稱 var data = db.Query().Include(i => i.Products).ToList(); Exists查詢
var data = db.Query() .Where(w => db.Query().WhereIF(!string.IsNullOrWhiteSpace("測(cè)試"), a => a.ProductId == 1).Select(s => 1).Any()) .Select(s => new { s.ProductId, s.ProductCode }).ToList(); 查詢綁定字段(注意 字段必須是公開(kāi)的,否則綁定外部無(wú)法訪問(wèn),沒(méi)有意義)
//當(dāng)某些字段需要參與計(jì)算并且不返回前端時(shí)推薦用字段綁定,無(wú)需從A實(shí)體轉(zhuǎn)換到B實(shí)體,強(qiáng)烈推薦此方式var data = db.Query().Select(s => new Product() { _xx = s.ProductName }).First(); 八、Lambda表達(dá)式動(dòng)態(tài)表達(dá)式 命名空間 Fast.Framework.Utils
var ex = DynamicWhereExp.Create().AndIF(1 == 1, a => a.DeleteMark == true).Build(); var data = db.Query().Where(ex).ToList(); Sql函數(shù) 自定義函數(shù) 需引入命名空間 Fast.Framework.Utils 使用SqlFunc類
SqlServer
類型轉(zhuǎn)換
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| ToString | CONVERT( VARCHAR(255),123) | 轉(zhuǎn)換 VARCHAR | 否 |
| ToDateTime | CONVERT( DATETIME,‘2022-09-16’) | 轉(zhuǎn)換 DATETIME | 否 |
| ToDecimal | CONVERT( DECIMAL(10,6),‘123’) | 轉(zhuǎn)換 DECIMAL | 否 |
| ToDouble | CONVERT( NUMERIC(10,6),‘123’) | 轉(zhuǎn)換 NUMERIC | 否 |
| ToSingle | CONVERT( FLOAT,‘123’) | 轉(zhuǎn)換 FLOAT | 否 |
| ToInt32 | CONVERT( INT,‘123’) | 轉(zhuǎn)換 INT | 否 |
| ToInt64 | CONVERT( BIGINT,‘123’) | 轉(zhuǎn)換 BIGINT | 否 |
| ToBoolean | CONVERT( BIT,‘1’) | 轉(zhuǎn)換 BIT | 否 |
| ToChar | CONVERT( CHAR(2),"x") | 轉(zhuǎn)換 CHAR | 否 |
聚合函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Max | MAX( a.[xx] ) | 最大值 | 是 |
| Min | MIN( a.[xx] ) | 最小值 | 是 |
| Count | COUNT( a.[xx] ) | 計(jì)數(shù) | 是 |
| Sum | SUM( a.[xx] ) | 合計(jì) | 是 |
| Avg | AVG( a.[xx] ) | 平均 | 是 |
數(shù)學(xué)函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Abs | ABS( a.[xx] ) | 絕對(duì)值 | 是 |
| Round | ROUND( a.[xx] ,2 ) | 四舍五入 | 是 |
字符串函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| StartsWith | LIKE "xx"+‘%’ | 左模糊 | 否 |
| EndsWith | LIKE ‘%’+"xx" | 右模糊 | 否 |
| Contains | LIKE ‘%’+"xx"+‘%’ | 全模糊 | 否 |
| SubString | SUBSTRING( "xxxxxx" ,1,3) | 截取 | 否 |
| Replace | REPLACE( "xxx","x","y") | 替換 | 否 |
| Len | LEN( "xxx" ) | 長(zhǎng)度 | 是 |
| TrimStart | LTRIM( " xx " ) | 修剪起始空格 | 否 |
| TrimEnd | RTRIM( " xx " ) | 修剪末尾空格 | 否 |
| ToUpper | UPPER( "xx" ) | 大寫 | 否 |
| ToLower | LOWER( "xx" ) | 小寫 | 否 |
| Concat | CONCAT(a.[xx1],a.[xx2]) | 字符串拼接 | 否 |
| Operation | [CreateTime] >= @Now_1 | 日期、數(shù)值、字符串范圍比較 | 是 |
日期函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| DateDiff | DATEDIFF( DAY ,a.[xx],b.[xx]) | 日期相差 | 是 |
| AddYears | DATEADD( YEAR,a.[xx],1 ) | 添加年份 | 否 |
| AddMonths | DATEADD( MONTH,a.[xx],1 ) | 添加月份 | 否 |
| AddDays | DATEADD( DAY,a.[xx],1 ) | 添加天數(shù) | 否 |
| AddHours | DATEADD( HOUR,a.[xx],1 ) | 添加時(shí) | 否 |
| AddMinutes | DATEADD( MINUTE,a.[xx],1 ) | 添加分 | 否 |
| AddSeconds | DATEADD( SECOND,a.[xx],1 ) | 添加秒 | 否 |
| AddMilliseconds | DATEADD( MILLISECOND,a.[xx],1 ) | 添加毫秒 | 否 |
| Year | YEAR( a.[xx] ) | 獲取年份 | 是 |
| Month | MONTH( a.[xx] ) | 獲取月份 | 是 |
| Day | DAY( a.[xx] ) | 獲取天數(shù) | 是 |
其它函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| NewGuid | NEWID() | 獲取GUID | 否 |
| Equals | p.[ProductCode] = "123" | 比較 | 否 |
| IsNull | ISNULL(a.[xx],0) | 是否為空 | 是 |
| Case | CASE | case | 是 |
| When | WHEN | when | 是 |
| Then | THEN | then | 是 |
| Else | ELSE | else | 是 |
| End | END | end | 是 |
MySql
類型轉(zhuǎn)換
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| ToString | CAST( a.`xx` AS CHAR(510) ) | 轉(zhuǎn)換 CHAR(510) | 否 |
| ToDateTime | CAST( a.`xx` AS DATETIME ) | 轉(zhuǎn)換 DATETIME | 否 |
| ToDecimal | CAST( a.`xx` AS DECIMAL(10,6) ) | 轉(zhuǎn)換 DECIMAL(10,6) | 否 |
| ToDouble | CAST( a.`xx` AS DECIMAL(10,6) ) | 轉(zhuǎn)換 DECIMAL(10,6) | 否 |
| ToInt32 | CAST( a.`xx` AS DECIMAL(10) ) | 轉(zhuǎn)換 DECIMAL(10) | 否 |
| ToInt64 | CAST( a.`xx` AS DECIMAL(19) ) | 轉(zhuǎn)換 DECIMAL(19) | 否 |
| ToBoolean | CAST( a.`xx` AS UNSIGNED ) | 轉(zhuǎn)換 UNSIGNED | 否 |
| ToChar | CAST( a.`xx` AS CHAR(2) ) | 轉(zhuǎn)換 CHAR(2) | 否 |
聚合函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Max | MAX( a.`xx` ) | 最大值 | 是 |
| Min | MIN( a.`xx` ) | 最小值 | 是 |
| Count | COUNT( a.`xx` ) | 計(jì)數(shù) | 是 |
| Sum | SUM( a.`xx` ) | 合計(jì) | 是 |
| Avg | AVG( a.`xx` ) | 平均 | 是 |
數(shù)學(xué)函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Abs | ABS( a.`xx` ) | 絕對(duì)值 | 是 |
| Round | ROUND( a.`xx` ,2 ) | 四舍五入 | 是 |
字符串函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| StartsWith | LIKE CONCAT( "xx","%" ) | 左模糊 | 否 |
| EndsWith | LIKE CONCAT( "%","xx" ) | 右模糊 | 否 |
| Contains | LIKE CONCAT( "%","xx","%" ) | 全模糊 | 否 |
| SubString | SUBSTRING( "xxxxxx" ,1,3 ) | 截取 | 否 |
| Replace | REPLACE( "xxx","x","y" ) | 替換 | 否 |
| Len | LEN( "xxx" ) | 長(zhǎng)度 | 是 |
| Trim | TRIM( " xx " ) | 修剪空格 | 否 |
| TrimStart | LTRIM( " xx " ) | 修剪起始空格 | 否 |
| TrimEnd | RTRIM( " xx " ) | 修剪末尾空格 | 否 |
| ToUpper | UPPER( "xx" ) | 大寫 | 否 |
| ToLower | LOWER( "xx" ) | 小寫 | 否 |
| Concat | CONCAT(a.`xx1`,a.`xx2`) | 字符串拼接 | 否 |
| Operation | `CreateTime` >= @Now_1 | 日期、數(shù)值、字符串范圍比較 | 是 |
日期函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| DateDiff | DATEDIFF( a.`xx`,b.`xx` ) | 日期相差 返回相差天數(shù) | 是 |
| TimestampDiff | TIMESTAMPDIFF( DAY,a.`xx`,b.`xx` ) | 日期相差 指定時(shí)間單位 | 是 |
| AddYears | DATE_ADD( a.`xx`,INTERVAL 1 YEAR ) | 添加年份 | 否 |
| AddMonths | DATE_ADD( a.`xx`,INTERVAL 1 MONTH ) | 添加月份 | 否 |
| AddDays | DATE_ADD( a.`xx`,INTERVAL 1 DAY ) | 添加天數(shù) | 否 |
| AddHours | DATE_ADD( a.`xx`,INTERVAL 1 HOUR ) | 添加時(shí) | 否 |
| AddMinutes | DATE_ADD( a.`xx`,INTERVAL 1 MINUTE ) | 添加分 | 否 |
| AddSeconds | DATE_ADD( a.`xx`,INTERVAL 1 SECOND ) | 添加秒 | 否 |
| AddMilliseconds | DATE_ADD( a.`xx`,INTERVAL 1 MINUTE_SECOND ) | 添加毫秒 | 否 |
| Year | YEAR( a.`xx` ) | 獲取年份 | 是 |
| Month | MONTH( a.`xx` ) | 獲取月份 | 是 |
| Day | DAY( a.`xx` ) | 獲取天數(shù) | 是 |
其它函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| NewGuid | UUID() | 獲取GUID | 否 |
| Equals | p.`ProductCode` = "123" | 比較 | 否 |
| IfNull | IFNULL( a.`xx`,0 ) | 如果為空 | 是 |
| Case | CASE | case | 是 |
| When | WHEN | when | 是 |
| Then | THEN | then | 是 |
| Else | ELSE | else | 是 |
| End | END | end | 是 |
Oracle
類型轉(zhuǎn)換
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| ToString | CAST( a."xx" AS VARCHAR(255) ) | 轉(zhuǎn)換 VARCHAR | 否 |
| ToDateTime | TO_TIMESTAMP( a."xx" ,"yyyy-MM-dd hh:mi:ss.ff") | 轉(zhuǎn)換 DATETIME | 否 |
| ToDecimal | CAST( a."xx" AS DECIMAL(10,6) ) | 轉(zhuǎn)換 DECIMAL | 否 |
| ToDouble | CAST( a."xx" AS NUMBER ) | 轉(zhuǎn)換 NUMBER | 否 |
| ToSingle | CAST( a."xx" AS FLOAT ) | 轉(zhuǎn)換 FLOAT | 否 |
| ToInt32 | CAST( a."xx" AS INT ) | 轉(zhuǎn)換 INT | 否 |
| ToInt64 | CAST( a."xx" AS NUMBER ) | 轉(zhuǎn)換 NUMBER | 否 |
| ToBoolean | CAST( a."xx" AS CHAR(1) ) | 轉(zhuǎn)換 CHAR | 否 |
| ToChar | CAST( a."xx" AS CHAR(2) ) | 轉(zhuǎn)換 CHAR | 否 |
聚合函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Max | MAX( a."xx" ) | 最大值 | 是 |
| Min | MIN( a."xx" ) | 最小值 | 是 |
| Count | COUNT( a."xx" ) | 計(jì)數(shù) | 是 |
| Sum | SUM( a."xx" ) | 合計(jì) | 是 |
| Avg | AVG( a."xx" ) | 平均 | 是 |
數(shù)學(xué)函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Abs | ABS( a."xx" ) | 絕對(duì)值 | 是 |
| Round | ROUND( a."xx" ,2 ) | 四舍五入 | 是 |
字符串函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| StartsWith | LIKE CONCAT( "xx","%" ) | 左模糊 | 否 |
| EndsWith | LIKE CONCAT( "%","xx" ) | 右模糊 | 否 |
| Contains | LIKE CONCAT( "%","xx","%" ) | 全模糊 | 否 |
| SubString | SUBSTRING( "xxxxxx" ,1,3) | 截取 | 否 |
| Replace | REPLACE( "xxx","x","y") | 替換 | 否 |
| Length | LENGTH( "xxx" ) | 長(zhǎng)度 | 是 |
| TrimStart | LTRIM( " xx " ) | 修剪起始空格 | 否 |
| TrimEnd | RTRIM( " xx " ) | 修剪末尾空格 | 否 |
| ToUpper | UPPER( "xx" ) | 大寫 | 否 |
| ToLower | LOWER( "xx" ) | 小寫 | 否 |
| Concat | CONCAT(a."xx1",a."xx2") | 字符串拼接 | 否 |
| Operation | ”CreateTime“ >= @Now_1 | 日期、數(shù)值、字符串范圍比較 | 是 |
日期函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Year | EXTRACT( YEAR FROM a."xx" ) | 獲取年份 | 是 |
| Month | EXTRACT( MONTH FROM a."xx" ) | 獲取月份 | 是 |
| Day | EXTRACT( DAY FROM a."xx" ) | 獲取天數(shù) | 是 |
其它函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Equals | p."ProductCode" = "123" | 比較 | 否 |
| Nvl | NVL( a."xx",0 ) | 空,默認(rèn) | 是 |
| Case | CASE | case | 是 |
| When | WHEN | when | 是 |
| Then | THEN | then | 是 |
| Else | ELSE | else | 是 |
| End | END | end | 是 |
PostgreSql
類型轉(zhuǎn)換
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| ToString | a."xx"::VARCHAR(255) | 轉(zhuǎn)換 VARCHAR | 否 |
| ToDateTime | a."xx"::TIMESTAMP | 轉(zhuǎn)換 TIMESTAMP | 否 |
| ToDecimal | a."xx"::DECIMAL(10,6) | 轉(zhuǎn)換 DECIMAL | 否 |
| ToDouble | a."xx"::NUMERIC(10,6) | 轉(zhuǎn)換 NUMERIC | 否 |
| ToSingle | a."xx"::REAL | 轉(zhuǎn)換 REAL | 否 |
| ToInt32 | a."xx"::INTEGER | 轉(zhuǎn)換 INT | 否 |
| ToInt64 | a."xx"::BIGINT | 轉(zhuǎn)換 BIGINT | 否 |
| ToBoolean | a."xx"::BOOLEAN | 轉(zhuǎn)換 BOOLEAN | 否 |
| ToChar | a."xx"::CHAR(2) | 轉(zhuǎn)換 CHAR | 否 |
聚合函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Max | MAX( a."xx" ) | 最大值 | 是 |
| Min | MIN( a."xx" ) | 最小值 | 是 |
| Count | COUNT( a."xx" ) | 計(jì)數(shù) | 是 |
| Sum | SUM( a."xx" ) | 合計(jì) | 是 |
| Avg | AVG( a."xx" ) | 平均 | 是 |
數(shù)學(xué)函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Abs | ABS( a."xx" ) | 絕對(duì)值 | 是 |
| Round | ROUND( a."xx" ,2 ) | 四舍五入 | 是 |
字符串函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| StartsWith | LIKE CONCAT( "%","xx" ) | 左模糊 | 否 |
| EndsWith | LIKE CONCAT( "xx","%" ) | 右模糊 | 否 |
| Contains | LIKE CONCAT( "%","xx","%" ) | 全模糊 | 否 |
| SubString | SUBSTRING( "xxxxxx" ,1,3 ) | 截取 | 否 |
| Replace | REPLACE( "xxx","x","y" ) | 替換 | 否 |
| Length | LENGTH( "xxx" ) | 長(zhǎng)度 | 是 |
| Trim | TRIM( " xx " ) | 修剪空格 | 否 |
| TrimStart | LTRIM( " xx " ) | 修剪起始空格 | 否 |
| TrimEnd | RTRIM( " xx " ) | 修剪末尾空格 | 否 |
| ToUpper | UPPER( "xx" ) | 大寫 | 否 |
| ToLower | LOWER( "xx" ) | 小寫 | 否 |
| Concat | CONCAT(a."xx1",a."xx2") | 字符串拼接 | 否 |
| Operation | ”CreateTime“ >= @Now_1 | 日期、數(shù)值、字符串范圍比較 | 是 |
日期函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| AddYears | a."xx" + INTERVAL "1 YEAR" | 添加年份 | 否 |
| AddMonths | a."xx" + INTERVAL "1 MONTH" | 添加月份 | 否 |
| AddDays | a."xx" + INTERVAL "1 DAY" | 添加天數(shù) | 否 |
| AddHours | a."xx" + INTERVAL "1 HOUR" | 添加時(shí) | 否 |
| AddMinutes | a."xx" + INTERVAL "1 MINUTE" | 添加分 | 否 |
| AddSeconds | a."xx" + INTERVAL "1 SECOND" | 添加秒 | 否 |
| AddMilliseconds | a."xx" + INTERVAL "1 MINUTE_SECOND" | 添加毫秒 | 否 |
| Year | YEAR( a."xx" ) | 獲取年份 | 是 |
| Month | MONTH( a."xx" ) | 獲取月份 | 是 |
| Day | DAY( a."xx" ) | 獲取天數(shù) | 是 |
查詢函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| In | IN ( a."xx" ,"x1","x2","x3" ) | In查詢 | 是 |
| NotIn | NOT IN ( a."xx" ,"x1","x2","x3" ) | Not In查詢 | 是 |
其它函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Equals | p.”ProductCode“ = "123" | 比較 | 否 |
| Case | CASE | case | 是 |
| When | WHEN | when | 是 |
| Then | THEN | then | 是 |
| Else | ELSE | else | 是 |
| End | END | end | 是 |
Sqlite
類型轉(zhuǎn)換
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| ToString | CAST(a.[xx] AS TEXT ) | 轉(zhuǎn)換 TEXT | 否 |
| ToDateTime | DATETIME( a.[xx] ) | 轉(zhuǎn)換 DateTime | 否 |
| ToDecimal | CAST(a.[xx] AS DECIMAL(10,6) ) | 轉(zhuǎn)換 DECIMAL | 否 |
| ToDouble | CAST(a.[xx] AS NUMERIC(10,6) ) | 轉(zhuǎn)換 NUMERIC | 否 |
| ToSingle | CAST(a.[xx] AS FLOAT ) | 轉(zhuǎn)換 FLOAT | 否 |
| ToInt32 | CAST(a.[xx] AS INTEGER ) | 轉(zhuǎn)換 INTEGER | 否 |
| ToInt64 | CAST(a.[xx] AS BIGINT ) | 轉(zhuǎn)換 BIGINT | 否 |
| ToBoolean | CAST(a.[xx] AS CHAR(1) ) | 轉(zhuǎn)換 CHAR | 否 |
| ToChar | CAST(a.[xx] AS CHAR(2) ) | 轉(zhuǎn)換 CHAR | 否 |
聚合函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Max | MAX( a.[xx] ) | 最大值 | 是 |
| Min | MIN( a.[xx] ) | 最小值 | 是 |
| Count | COUNT( a.[xx] ) | 計(jì)數(shù) | 是 |
| Sum | SUM( a.[xx] ) | 合計(jì) | 是 |
| Avg | AVG( a.[xx] ) | 平均 | 是 |
數(shù)學(xué)函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Abs | ABS( a.[xx] ) | 絕對(duì)值 | 是 |
| Round | ROUND( a.[xx] ,2 ) | 四舍五入 | 是 |
字符串函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| StartsWith | LIKE "xx"||"%" | 左模糊 | 否 |
| EndsWith | LIKE "%"||"xx" | 否 | |
| Contains | LIKE "%"||"xx"||"%" | 全模糊 | 否 |
| SubString | SUBSTRING( "xxxxxx" ,1,3 ) | 截取 | 否 |
| Replace | REPLACE( "xxx","x","y" ) | 替換 | 否 |
| Length | LENGTH( "xxx" ) | 長(zhǎng)度 | 是 |
| Trim | TRIM( " xx " ) | 修剪空格 | 否 |
| TrimStart | LTRIM( " xx " ) | 修剪起始空格 | 否 |
| TrimEnd | RTRIM( " xx " ) | 修剪末尾空格 | 否 |
| ToUpper | UPPER( "xx" ) | 大寫 | 否 |
| ToLower | LOWER( "xx" ) | 小寫 | 否 |
| Operation | [CreateTime] >= @Now_1 | 日期、數(shù)值、字符串范圍比較 | 是 |
日期函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| AddYears | DATETIME( a.[xx],"1 YEAR" ) | 添加年份 | 否 |
| AddMonths | DATETIME( a.[xx],"1 MONTH" ) | 添加月份 | 否 |
| AddDays | DATETIME( a.[xx],"1 DAY" ) | 添加天數(shù) | 否 |
| AddHours | DATETIME( a.[xx],"1 HOUR" ) | 添加時(shí) | 否 |
| AddMinutes | DATETIME( a.[xx],"1 MINUTE" ) | 添加分 | 否 |
| AddSeconds | DATETIME( a.[xx],"1 SECOND" ) | 添加秒 | 否 |
| AddMilliseconds | DATETIME( a.[xx],"1 YEAR" ) | 添加毫秒 | 否 |
| Year | STRFTIME( "%Y", a.[xx] ) | 獲取年份 | 是 |
| Month | STRFTIME( "%m", a.[xx] ) | 獲取月份 | 是 |
| Day | STRFTIME( "%j", a.[xx] ) | 獲取天數(shù) | 是 |
其它函數(shù)
| 方法名稱 | 解析示例值 | 說(shuō)明 | 自定義函數(shù) |
|---|---|---|---|
| Equals | p.”ProductCode“ = "123" | 比較 | 否 |
| Case | CASE | case | 是 |
| When | WHEN | when | 是 |
| Then | THEN | then | 是 |
| Else | ELSE | else | 是 |
| End | END | end | 是 |
添加自定義函數(shù)解析
//注意:只能擴(kuò)展未實(shí)現(xiàn)的方法名稱 不能覆蓋原有的實(shí)現(xiàn) Models.DbType.MySQL.AddSqlFunc("方法名稱", (visit, method, sqlStack) => { //解析邏輯 });九、數(shù)據(jù)庫(kù)日志db.Aop.DbLog = (sql, dp) => { Console.WriteLine($"執(zhí)行Sql:{sql}"); if (dp != null) { foreach (var item in dp) { Console.WriteLine($"參數(shù)名稱:{item.ParameterName} 參數(shù)值:{item.ParameterValue}"); } } };十、事務(wù)普通事務(wù)
try { db.Ado.BeginTran();//開(kāi)啟事務(wù) // 執(zhí)行 CRUD db.Ado.CommitTran();//提交事務(wù) } catch (Exception ex) { Console.WriteLine(ex.Message); db.Ado.RollbackTran();//回滾事務(wù) }更大范圍的事務(wù)
try { db.BeginTran();//開(kāi)啟事務(wù) // 執(zhí)行 CRUD db.CommitTran();//提交事務(wù) } catch (Exception ex) { db.RollbackTran();//回滾事務(wù) Console.WriteLine(ex.Message); }十一、多租戶改變數(shù)據(jù)庫(kù)
//數(shù)據(jù)庫(kù)配置可從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 十二、原生特性支持/// /// 產(chǎn)品 /// [Table("ProductMain")] public class Product { /// /// 產(chǎn)品ID /// [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ProductId { get; set; } /// /// 產(chǎn)品編號(hào) /// [Column("ProductCode")]//不標(biāo)記默認(rèn)取當(dāng)前屬性名稱 public string ProductCode { get; set; } /// /// 自定義1 /// [NotMapped] public string Custom1 { get; set; } /// /// 自定義2 /// [Column(TypeName="Json")]//類型標(biāo)記為Json格式對(duì)象 匿名對(duì)象屬性以及字典值類型 IsClass&&!type.Equals(typeof(string)) 將自動(dòng)序列化成Json格式 public Category Custom2 { get; set; } }十三、原生Ado// 原始起步 // var conn = db.Ado.DbProviderFactory.CreateConnection(); // var cmd = conn.CreateCommand(); // 封裝的方法分別以Execute和Create開(kāi)頭以及預(yù)處理 PrepareCommand 方法 // 該方法可以自動(dòng)幫你處理執(zhí)行的預(yù)操作,主要作用是代碼復(fù)用。 // 當(dāng)有非常復(fù)雜的查詢 ORM不能滿足需求的時(shí)候可以使用原生Ado滿足業(yè)務(wù)需求 // 構(gòu)建數(shù)據(jù)集核心擴(kuò)展方法 分別有 FristBuild ListBuild DictionaryBuild DictionaryListBuild var data = db.Ado.ExecuteReader(CommandType.Text, "select * from product", null).ListBuild(); 十四、工作單元注冊(cè)數(shù)據(jù)庫(kù)上下文和工作單元服務(wù)
var builder = WebApplication.CreateBuilder(args);var configuration = builder.Configuration;// 添加數(shù)據(jù)庫(kù)上下文服務(wù)builder.Services.AddFastDbContext();// 添加工作單元服務(wù)builder.Services.AddUnitOfWork();// 加載數(shù)據(jù)庫(kù)配置builder.Services.Configure>(configuration.GetSection("DbConfig"));
實(shí)際應(yīng)用
/// /// 工作單元 /// private readonly IUnitOfWork unitOfWork; /// /// 構(gòu)造方法 /// /// 工作單元 public UnitOfWorkTestService(IUnitOfWork unitOfWork) { this.unitOfWork = unitOfWork; } /// /// 測(cè)試 /// /// public string Test() { //unitOfWork 對(duì)象無(wú)需顯示使用using var result1 = unitOfWork.Db.Insert(new Category() { CategoryName = "類別3" }).Exceute(); var result2 = unitOfWork.Db.Insert(new Product() { ProductCode = "測(cè)試工作單元", }).Exceute(); unitOfWork.Commit(); return "工作單元執(zhí)行完成..."; }十五、大數(shù)據(jù)導(dǎo)入批復(fù)制 僅支持SqlServer Oracle MySql PostgreSql
var list = new List(); for (int j = 1; j <= 100000; j++) { list.Add(new Product() { CategoryId = 1, ProductCode = $"測(cè)試編號(hào)_{Timestamp.CurrentTimestampSeconds()}_{j}", ProductName = $"測(cè)試名稱_{Timestamp.CurrentTimestampSeconds()}_{j}", CreateTime = DateTime.Now, Custom1 = $"測(cè)試自定義1_{Timestamp.CurrentTimestampSeconds()}_{j}", Custom2 = $"測(cè)試自定義2_{Timestamp.CurrentTimestampSeconds()}_{j}", Custom3 = $"測(cè)試自定義3_{Timestamp.CurrentTimestampSeconds()}_{j}", Custom4 = $"測(cè)試自定義4_{Timestamp.CurrentTimestampSeconds()}_{j}", Custom5 = $"測(cè)試自定義5_{Timestamp.CurrentTimestampSeconds()}_{j}", Custom6 = $"測(cè)試自定義6_{Timestamp.CurrentTimestampSeconds()}_{j}", Custom7 = $"測(cè)試自定義7_{Timestamp.CurrentTimestampSeconds()}_{j}", Custom8 = $"測(cè)試自定義8_{Timestamp.CurrentTimestampSeconds()}_{j}", Custom9 = $"測(cè)試自定義9_{Timestamp.CurrentTimestampSeconds()}_{j}", Custom10 = $"測(cè)試自定義10_{Timestamp.CurrentTimestampSeconds()}_{j}", Custom11 = $"測(cè)試自定義11_{Timestamp.CurrentTimestampSeconds()}_{j}", Custom12 = $"測(cè)試自定義12_{Timestamp.CurrentTimestampSeconds()}_{j}", }); } db.Fast().BulkCopy(list); 關(guān)鍵詞:
歐洲圣誕新年假期_歐洲圣誕節(jié)放假時(shí)間 天天快資訊 1、一天或者是一周。2、嚴(yán)格地說(shuō),美國(guó)沒(méi)有全國(guó)性的假日,因?yàn)楦鱾€(gè)州都
今日熱聞!自研ORM (匠心之作) FastFramework作者M(jìn)r-zhong代碼改變世界 一、前言FastFramew
抱歉藏不住了!這些年輕車主告訴你,為何種草全新一代瑞虎7 PLUS 都說(shuō)現(xiàn)在的新青年挑剔、難伺候,100分產(chǎn)品要達(dá)到200分品質(zhì),才能征服他們的心。其實(shí)對(duì)于
【新要聞】河口吧租房信息(河口吧) 來(lái)為大家解答以上的問(wèn)題。河口吧租房信息,河口吧這個(gè)很多人還不知道,
成都大運(yùn)會(huì)倒計(jì)時(shí)30天:有序推進(jìn)競(jìng)賽組織 具備正賽舉辦條件 世界時(shí)訊 中新社成都6月28日電記者28日從第31屆世界大學(xué)生夏季運(yùn)動(dòng)會(huì)(簡(jiǎn)稱成都大
【世界新視野】冰糖雪梨銀耳湯的做法大全_冰糖雪梨銀耳湯的做法 1、準(zhǔn)備銀耳雪梨湯的配料,包括梨、銀耳、紅棗、枸杞、冰糖、純凈水。2
今日關(guān)注:文旅部:與文旅融合共生 廣場(chǎng)舞表演將登陸首鋼冰球館 人民網(wǎng)北京6月29日電(記者魯婧)6月29日上午,文化和旅游部舉行第二季