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);

推荐内容

  • 今日热闻!自研ORM (匠心之作)
    今日热闻!自研ORM (匠心之作)

  • 氯碱化工:公司聚氯乙烯产品符合产品质量标准 环球速读
    氯碱化工:公司聚氯乙烯产品符合产品质量标准 环球速读

  • 2023年985大学预估提档线分数(江苏) 世界观察
    2023年985大学预估提档线分数(江苏) 世界观察

  • 刘强东减持京东股份?知情人士:不是个人减持,是员工持股平台-焦点报道
    刘强东减持京东股份?知情人士:不是个人减持,是员工持股平台-焦点报道

  • 河北北方学院开设专业有什么 河北北方学院优势专业是什么
    河北北方学院开设专业有什么 河北北方学院优势专业是什么

  • 集合啦动物森友会小动物合租主题怎么合并-环球信息
    集合啦动物森友会小动物合租主题怎么合并-环球信息

  • 高考632分的“轮椅男孩”,获东南大学邀请!
    高考632分的“轮椅男孩”,获东南大学邀请!

  • 延边州气象台6月29日14时20分发布雷电黄色预警
    延边州气象台6月29日14时20分发布雷电黄色预警

  • 期货热点追踪金十期货特约冠通期货点评尿素
    期货热点追踪金十期货特约冠通期货点评尿素

  • 云顶之弈s7海克斯科技目录大全
    云顶之弈s7海克斯科技目录大全

  • 抱歉藏不住了!这些年轻车主告诉你,为何种草全新一代瑞虎7 PLUS
    抱歉藏不住了!这些年轻车主告诉你,为何种草全新一代瑞虎7 PLUS

  • 最新快讯!她俩暗暗比美20年,一张同框照说明一切
    最新快讯!她俩暗暗比美20年,一张同框照说明一切

  • 运动鞋是不是不能水洗(运动鞋能洗吗)
    运动鞋是不是不能水洗(运动鞋能洗吗)

  • 世界动态:北京外事研修学院地址(北京外事研修学院)
    世界动态:北京外事研修学院地址(北京外事研修学院)

  • Vivo y33s智能手机电池容量为5000mAh|报资讯
    Vivo y33s智能手机电池容量为5000mAh|报资讯

  • Tecno Spark 6配备4GBRAM和64GB内置存储容量
    Tecno Spark 6配备4GBRAM和64GB内置存储容量

  • Vivo S1智能手机搭载联发科HelioP65芯片组|环球看热讯
    Vivo S1智能手机搭载联发科HelioP65芯片组|环球看热讯

  • 老人与海歌曲原唱 老人与海歌 焦点报道
    老人与海歌曲原唱 老人与海歌 焦点报道

  • 阿斯巴甜致癌风波再掀“谈糖色变” 机构呼吁关注三氯蔗糖加速替代机会
    阿斯巴甜致癌风波再掀“谈糖色变” 机构呼吁关注三氯蔗糖加速替代机会

  • 【天天播资讯】超卓航科:
公司生产的靶材应用领域主要有太阳能电池、玻璃、显示器、触摸屏、半导体等
    【天天播资讯】超卓航科: 公司生产的靶材应用领域主要有太阳能电池、玻璃、显示器、触摸屏、半导体等

  • 简讯:江雪这首诗的诗意及单个字的解释 江雪这首诗的诗意
    简讯:江雪这首诗的诗意及单个字的解释 江雪这首诗的诗意

  • 欧洲圣诞新年假期_欧洲圣诞节放假时间 天天快资讯
    欧洲圣诞新年假期_欧洲圣诞节放假时间 天天快资讯

  • 天天亮点!和评理 | 诿过他国无济于事 美国需刮骨疗毒
    天天亮点!和评理 | 诿过他国无济于事 美国需刮骨疗毒

  • 多地用电高峰前置,需求支撑煤炭市场小幅升温_重点聚焦
    多地用电高峰前置,需求支撑煤炭市场小幅升温_重点聚焦

  • 世界新资讯:首次五部门联合行动!重庆启动河湖安全保护专项执法行动
    世界新资讯:首次五部门联合行动!重庆启动河湖安全保护专项执法行动

  • 【世界播资讯】涉“世越号”公文造假案 韩国前青瓦台秘书室长终审被判无罪
    【世界播资讯】涉“世越号”公文造假案 韩国前青瓦台秘书室长终审被判无罪

  • 朝鲜的宣传画 中国人看了好熟悉
    朝鲜的宣传画 中国人看了好熟悉

  • ip段查询工具(ip段)
    ip段查询工具(ip段)

  • ibm(t61)-当前速看
    ibm(t61)-当前速看

  • 正方体的表面积是什么(正方体的表面积公式是什么?)|全球速读
    正方体的表面积是什么(正方体的表面积公式是什么?)|全球速读

  • 为未成年人撑起一片清朗的网络天空
    为未成年人撑起一片清朗的网络天空

  • 【天天速看料】硫化铁是不是沉淀_硫化铁存在吗
    【天天速看料】硫化铁是不是沉淀_硫化铁存在吗

  • 奶奶烧蚂蚁窝烧伤俩孙子:引燃一桶10斤酒精_当前通讯
    奶奶烧蚂蚁窝烧伤俩孙子:引燃一桶10斤酒精_当前通讯

  • ChatGPT用来洗稿实在是太牛掰了…… 比如,给他要求做个论文 世界新资讯
    ChatGPT用来洗稿实在是太牛掰了…… 比如,给他要求做个论文 世界新资讯

  • 性感背心女神汉娜·布朗夫曼健身照!
    性感背心女神汉娜·布朗夫曼健身照!

  • 籍贯是填中国吗_籍贯的意思
    籍贯是填中国吗_籍贯的意思

  • 除了基金股票还有什么理财?理财产品除了基金股票还有哪些?
    除了基金股票还有什么理财?理财产品除了基金股票还有哪些?

  • 前传系列ogwai有很多小精灵复活节彩蛋其中包括一个秘密客串
    前传系列ogwai有很多小精灵复活节彩蛋其中包括一个秘密客串

  • 全球热推荐:方江山:全面准确学习领会党的二十大精神 加强中国式现代化理论研究
    全球热推荐:方江山:全面准确学习领会党的二十大精神 加强中国式现代化理论研究

  • 新华社发文狠批“筑墙挡景”,被曝光景区的“墙”还能挺多久?
    新华社发文狠批“筑墙挡景”,被曝光景区的“墙”还能挺多久?

  • “南阳艾”产业迎来新助力,知名艾品牌精油工厂在桐柏县投产_天天关注
    “南阳艾”产业迎来新助力,知名艾品牌精油工厂在桐柏县投产_天天关注

  • 中水渔业(000798.SZ)收到政府补助8118.44万元 今日视点
    中水渔业(000798.SZ)收到政府补助8118.44万元 今日视点

  • 刚刚,姜广涛发文:开工
    刚刚,姜广涛发文:开工

  • 我国文化产业资产规模已超31万亿元 环球观热点
    我国文化产业资产规模已超31万亿元 环球观热点

  • 俄国玩怎么玩国服《Dota2》,《Dota2》加速器推荐
    俄国玩怎么玩国服《Dota2》,《Dota2》加速器推荐

  • 太吾绘卷铭刻人物_最新消息
    太吾绘卷铭刻人物_最新消息

  • 当前信息:驱邪
    当前信息:驱邪

  • 世界微动态丨采摘园里乐享“好时光”
    世界微动态丨采摘园里乐享“好时光”

  • 贝壳首个长租公寓落子成都!链家系再添新成员 | 租住资管-天天快看
    贝壳首个长租公寓落子成都!链家系再添新成员 | 租住资管-天天快看

  • 前知名港姐冠军突然宣布复出,气质高贵状态冻龄,横刀夺爱入豪门
    前知名港姐冠军突然宣布复出,气质高贵状态冻龄,横刀夺爱入豪门

  • 世界今头条!GrowingIO分析云应用市场再出新品,“渠道价值分析”有多好用?
    世界今头条!GrowingIO分析云应用市场再出新品,“渠道价值分析”有多好用?

  • 全球快讯:2023半年度又要开始交作业了!明星基金经理们过得还好吗?
    全球快讯:2023半年度又要开始交作业了!明星基金经理们过得还好吗?

  • 环球滚动:三国杀邓艾的技能是什么-邓艾技能介绍
    环球滚动:三国杀邓艾的技能是什么-邓艾技能介绍

  • 马可波罗上市审核状态变更为“已问询” 世界快报
    马可波罗上市审核状态变更为“已问询” 世界快报

  • 环球滚动:金条多少克_金条多少克
    环球滚动:金条多少克_金条多少克

  • 渝昆高铁川渝段全线贯通_当前播报
    渝昆高铁川渝段全线贯通_当前播报

  • 欢声笑语饺子鲜,长岛拥军志愿服务进军营_每日关注
    欢声笑语饺子鲜,长岛拥军志愿服务进军营_每日关注

  • 【新要闻】河口吧租房信息(河口吧)
    【新要闻】河口吧租房信息(河口吧)

  • 天天速读:俞敏洪首次透露遗嘱分配
    天天速读:俞敏洪首次透露遗嘱分配

  • 12年前的“春运母亲”被找到,记者约定跟拍她一辈子,如今怎样-焦点
    12年前的“春运母亲”被找到,记者约定跟拍她一辈子,如今怎样-焦点

  • 中药材牛市来了?100个品种价格翻倍,亳州市场冷库爆仓,诊所直呼开不起方子_看点
    中药材牛市来了?100个品种价格翻倍,亳州市场冷库爆仓,诊所直呼开不起方子_看点

  • 今日关注:文旅部:与文旅融合共生 广场舞表演将登陆首钢冰球馆
    今日关注:文旅部:与文旅融合共生 广场舞表演将登陆首钢冰球馆

  • 和顺电气:与中车智行等签署合作框架协议_环球热闻
    和顺电气:与中车智行等签署合作框架协议_环球热闻

  • 小米拍视频比例怎么设置
    小米拍视频比例怎么设置

  • “验瓜师”火了!“听音辨瓜”究竟有何科学依据?
    “验瓜师”火了!“听音辨瓜”究竟有何科学依据?

  • 中科磁业涨14.35%-每日聚焦
    中科磁业涨14.35%-每日聚焦

  • 为什么中国大陆难以推行eSIM#esim卡 #iPhone14 #运营商 ..._世界观察
    为什么中国大陆难以推行eSIM#esim卡 #iPhone14 #运营商 ..._世界观察

  • 【天天新视野】配置高动力强,售价103.90万,宝马X7表现亮眼
    【天天新视野】配置高动力强,售价103.90万,宝马X7表现亮眼

  • 【环球报资讯】四个维度深度比拼:凯迪拉克CT5和沃尔沃S60,谁更强?
    【环球报资讯】四个维度深度比拼:凯迪拉克CT5和沃尔沃S60,谁更强?

  • 文化和旅游部首次面向社会发布全国旅游服务质量提升报告
    文化和旅游部首次面向社会发布全国旅游服务质量提升报告

  • 现代京剧《红高粱》在宁夏银川首演-环球最新
    现代京剧《红高粱》在宁夏银川首演-环球最新

  • 公司工会的职能是什么职能_公司工会的职能是什么-环球快资讯
    公司工会的职能是什么职能_公司工会的职能是什么-环球快资讯

  • 中钢国际:获得民生银行15亿元综合授信-全球今日讯
    中钢国际:获得民生银行15亿元综合授信-全球今日讯

  • 协同创新助力拉链“飞天”(微观)
    协同创新助力拉链“飞天”(微观)

  • 成都大运会倒计时30天:有序推进竞赛组织 具备正赛举办条件 世界时讯
    成都大运会倒计时30天:有序推进竞赛组织 具备正赛举办条件 世界时讯

  • 4.5万名员工,裁掉超50%?!美媒曝光:这一巨头计划→-今日播报
    4.5万名员工,裁掉超50%?!美媒曝光:这一巨头计划→-今日播报

  • 短讯!瑞银在收购瑞士信贷后接手了一长串法律难题,现在它有望避免其中一个
    短讯!瑞银在收购瑞士信贷后接手了一长串法律难题,现在它有望避免其中一个

  • 起诉离婚后财产该怎么分配
    起诉离婚后财产该怎么分配

  • 市领导调研推进交通堵点治理工作-当前热点
    市领导调研推进交通堵点治理工作-当前热点

  • 2632
    2632

  • 金笔点龙漫画全集图片(金笔点龙)
    金笔点龙漫画全集图片(金笔点龙)

  • 世界要闻:胡一菲强吻曾小贤是第几季几集(胡一菲qq)
    世界要闻:胡一菲强吻曾小贤是第几季几集(胡一菲qq)

  • 健身不会让我购买苹果新款AR VR耳机这就是为什么
    健身不会让我购买苹果新款AR VR耳机这就是为什么

  • 新的Ubuntu Linux桌面即将推出 全球聚焦
    新的Ubuntu Linux桌面即将推出 全球聚焦

  • 随着气候变化意识的增强家电习惯正在慢慢改变|环球消息
    随着气候变化意识的增强家电习惯正在慢慢改变|环球消息

  • 环球快看:全国石油大学有哪些_石油大学有哪些
    环球快看:全国石油大学有哪些_石油大学有哪些

  • 马应龙:
按照相关规定,上市公司一般在定期报告中披露相应时点的股东人数,并在法定信息披露媒体上披露|全球看点
    马应龙: 按照相关规定,上市公司一般在定期报告中披露相应时点的股东人数,并在法定信息披露媒体上披露|全球看点

  • 我的世界漏斗英文(我的世界漏斗)
    我的世界漏斗英文(我的世界漏斗)

  • 全球快播:不用刷脸用身份证就能借款的(身份证照片发给别人安全吗)
    全球快播:不用刷脸用身份证就能借款的(身份证照片发给别人安全吗)

  • 挑灯夜战“超级基坑”!武汉周大福金融中心项目建设提速_世界最资讯
    挑灯夜战“超级基坑”!武汉周大福金融中心项目建设提速_世界最资讯

  • 专访瑞士百达赵俊杰:投资者需要给中国市场多一点的时间与耐心_播报
    专访瑞士百达赵俊杰:投资者需要给中国市场多一点的时间与耐心_播报

  • 6月制造业PMI为49% 生产、新订单指数均有所回升_世界快报
    6月制造业PMI为49% 生产、新订单指数均有所回升_世界快报

  • 康复治疗技术专升本可以跨什么专业(康复治疗技术专升本)
    康复治疗技术专升本可以跨什么专业(康复治疗技术专升本)

  • 天天动态:新凤霞戏曲名段欣赏_新凤霞
    天天动态:新凤霞戏曲名段欣赏_新凤霞

  • 环球今头条!来电不善演员表_来电不善
    环球今头条!来电不善演员表_来电不善

  • 杭州上半年土拍收金1002.9亿 累计出让宅地66宗、滨江拿地11宗居首位
    杭州上半年土拍收金1002.9亿 累计出让宅地66宗、滨江拿地11宗居首位

  • 发布国内首个冰荔产品标准,东莞以标准化撬动荔枝大市场
    发布国内首个冰荔产品标准,东莞以标准化撬动荔枝大市场

  • 业界热议海上风电发展:多方协同共促产业健康可持续发展 焦点滚动
    业界热议海上风电发展:多方协同共促产业健康可持续发展 焦点滚动

  • 明确禁售清单,落实主体责任盲盒经营要“盲”而有度|世界热推荐
    明确禁售清单,落实主体责任盲盒经营要“盲”而有度|世界热推荐

  • 淘宝上便宜的店铺推荐 私藏的淘宝店铺
    淘宝上便宜的店铺推荐 私藏的淘宝店铺

巴山传媒网