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 原生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;"    }]

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("ProductCode", "ProductName").Exceute();// 字段很多的话可以直接new List(){"列1","列2"}

忽略列更新

var result = db.Update(new Product() { ProductCode = "1001", ProductName = "1002" }).IgnoreColumns("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();//由于没有专门去扩展 Not Like 方法,可以用取反或使用比较变通实现 例如 w.ProductName.StartsWith("左模糊")==false //Mysql举例 最终解析后的结果为 `ProductName` Like "%左模糊" = 0 这种用法数据库是支持的 相当于 Not Like

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方法

查询并插入 仅支持同实例的数据库 跨库 个人还是建议 用事务分开写查询和插入

//方式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 需要注意的是 显示指定不带 列标识符 例如 `列名称1` 如有字段冲突 可自行加上标识符                var result2 = db.Query().Where(w => w.ProductId == 1489087).Select(s => new                {                    s.ProductCode,                    s.ProductName                }).Insert("表名称 同实例不同库 可以使用 db.数据库名称.表名称 ", "列名称1", "列名称2", "`带标识的列名称3`");                //方式3 需要注意同方式2 一样                var result3 = db.Query().Where(w => w.ProductId == 1489087).Select(s => new                {                    s.ProductCode,                    s.ProductName                }).Insert("表名称 同实例不同库 可以使用 db.数据库名称.表名称 ", new List() { "列名称1" });

In查询

// 方式1                var data1 = db.Query().Where(w => SqlFunc.In(w.ProductCode, "1001", "1002")).ToList();                // 方式2                var data2 = db.Query().Where(w => SqlFunc.In(w.ProductCode, new List() { "123", "456" })).ToList();                // 方式3 需要动态更新IN值 使用这种                var list = new List() { "123", "456" };                var data3 = db.Query().Where(w => SqlFunc.In(w.ProductCode, list)).ToList();                // 方法4 参数同上一样 单独分离IN和NotIN 是为了兼容匿名查询                var data4 = db.Query().In("字段名称", "1001", "1002").ToList();

Select子查询

var subQuery = db.Query().Where(w => w.ProductId == 1).Select(s => s.ProductName);                var sql1 = db.Query().Select(s => new Product()                {                    Custom1 = db.SubQuery(subQuery)// SubQuery 的泛型是根据你左边赋值的属性类型来定义                }).ToList();                // 这种没有使用new 的 泛型可随意定义 实际作用就是避免 对象属性赋值类型冲突的问题                var sql2 = db.Query().Select(s => db.SubQuery(subQuery)).ToList();

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();
八、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

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" )小写
OperationCreateTime >= @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] )获取天数

查询函数

方法名称解析示例值说明自定义函数
InIN ( a.[xx] ,"x1","x2","x3")In查询
NotInNOT IN ( a.[xx] ,"x1","x2","x3")Not In查询

其它函数

方法名称解析示例值说明自定义函数
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`)字符串拼接

日期函数

方法名称解析示例值说明自定义函数
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` )获取天数

查询函数

方法名称解析示例值说明自定义函数
InIN ( a.`xx` ,"x1","x2","x3" )In查询
NotInNOT IN ( a.`xx` ,"x1","x2","x3" )Not In查询

其它函数

方法名称解析示例值说明自定义函数
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")字符串拼接

日期函数

方法名称解析示例值说明自定义函数
YearEXTRACT( YEAR FROM a."xx" )获取年份
MonthEXTRACT( MONTH FROM a."xx" )获取月份
DayEXTRACT( DAY FROM a."xx" )获取天数

查询函数

方法名称解析示例值说明自定义函数
InIN ( a."xx" ,"x1","x2","x3")In查询
NotInNOT IN ( a."xx","x1","x2","x3")Not In查询

其它函数

方法名称解析示例值说明自定义函数
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")字符串拼接

日期函数

方法名称解析示例值说明自定义函数
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" )小写

日期函数

方法名称解析示例值说明自定义函数
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] )获取天数

查询函数

方法名称解析示例值说明自定义函数
InIN ( a."xx" ,"x1","x2","x3" )In查询
NotInNOT IN ( a."xx" ,"x1","x2","x3" )Not In查询

其它函数

方法名称解析示例值说明自定义函数
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]        public int ProductId { get; set; }        ///         /// 产品编号        ///         [Column("ProductCode")]//不标记默认取当前属性名称        public string ProductCode { get; set; }        ///         /// 自定义1        ///         [NotMapped]        public string Custom1 { 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.AddFastUnitOfWork();// 加载数据库配置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);

推荐内容

  • 一个可用于生产项目 基于 .NET 6 自研ORM
    一个可用于生产项目 基于 .NET 6 自研ORM

  • 全球今亮点!秋季肌肤问题多_秋季肌肤问题
    全球今亮点!秋季肌肤问题多_秋季肌肤问题

  • 天!涉案300亿,被判14年,安以轩老公都没了…|天天时讯
    天!涉案300亿,被判14年,安以轩老公都没了…|天天时讯

  • 快看点丨社保基金一季度新进3股,增持4股,集中在医药生物、计算机行业
    快看点丨社保基金一季度新进3股,增持4股,集中在医药生物、计算机行业

  • 临西:草莓番茄俏销市场
    临西:草莓番茄俏销市场

  • 高速网络测量的普适在线压缩统计理论与方法_关于高速网络测量的普适在线压缩统计理论与方法简述|环球热资讯
    高速网络测量的普适在线压缩统计理论与方法_关于高速网络测量的普适在线压缩统计理论与方法简述|环球热资讯

  • 谷雨雨水多阳气升,八道润燥祛湿汤要常喝,润燥祛湿,补足水分 世界通讯
    谷雨雨水多阳气升,八道润燥祛湿汤要常喝,润燥祛湿,补足水分 世界通讯

  • 国内用户无缘!iOS 17将支持三方应用商店或仅限欧洲:苹果准备收费
    国内用户无缘!iOS 17将支持三方应用商店或仅限欧洲:苹果准备收费

  • 世界热点!修身齐家治国平天下出自哪一部_修身齐家治国平天下 出自哪里
    世界热点!修身齐家治国平天下出自哪一部_修身齐家治国平天下 出自哪里

  • 蛋仔派对:庆生盛典闪耀登场!红包雨狂撒5天,有机会获1440蛋币
    蛋仔派对:庆生盛典闪耀登场!红包雨狂撒5天,有机会获1440蛋币

  • 【热闻】精致的猪猪女孩马晶_精致的猪猪女孩
    【热闻】精致的猪猪女孩马晶_精致的猪猪女孩

  • 每日资讯:末世孤城好玩吗 末世孤城玩法简介
    每日资讯:末世孤城好玩吗 末世孤城玩法简介

  • 【GPT机翻】战国小町苦劳谭 (戦国小町苦労譚)- 118 [千五百七十四年 七月中旬] 全球时快讯
    【GPT机翻】战国小町苦劳谭 (戦国小町苦労譚)- 118 [千五百七十四年 七月中旬] 全球时快讯

  • 顶流能不能有女友? 天天通讯
    顶流能不能有女友? 天天通讯

  • 京东京造儿童学习桌JZ400-12J看专家怎么说,良心点评配置区别 环球最资讯
    京东京造儿童学习桌JZ400-12J看专家怎么说,良心点评配置区别 环球最资讯

  • 宁德时代一季度大赚近百亿!股价却难逃资本“镰刀”,距年内最高点跌近20%
    宁德时代一季度大赚近百亿!股价却难逃资本“镰刀”,距年内最高点跌近20%

  • 全球观速讯丨孔梅
    全球观速讯丨孔梅

  • 未婚先孕?被哄骗生孩子?
    未婚先孕?被哄骗生孩子?

  • 江西德兴:创新履职阵地 “零距离”服务界别群众
    江西德兴:创新履职阵地 “零距离”服务界别群众

  • 今日要闻!助力全民阅读 新华书店启动“青少年学生阅读空间”
    今日要闻!助力全民阅读 新华书店启动“青少年学生阅读空间”

  • 上海证券交易所原副总经理刘逖接受监察调查|每日讯息
    上海证券交易所原副总经理刘逖接受监察调查|每日讯息

  • 衣藻的主要遗传物质_衣藻 热推荐
    衣藻的主要遗传物质_衣藻 热推荐

  • 世界百事通!北影节红毯:倪妮冷艳,高叶俗气,白百何好胖,张颂文引全场尖叫
    世界百事通!北影节红毯:倪妮冷艳,高叶俗气,白百何好胖,张颂文引全场尖叫

  • 贾静雯,这次的瓜有点大|全球观热点
    贾静雯,这次的瓜有点大|全球观热点

  • 福田区华富村中心学校初中部大学区招生办法(地段+规则)
    福田区华富村中心学校初中部大学区招生办法(地段+规则)

  • 一级冬枣的直径?|世界独家
    一级冬枣的直径?|世界独家

  • 全球时讯:江苏徐州:“数智”工厂全力竞发,高端“智”造奏响高质量发展新强音
    全球时讯:江苏徐州:“数智”工厂全力竞发,高端“智”造奏响高质量发展新强音

  • you are welcome to do什么意思_you are welcome
    you are welcome to do什么意思_you are welcome

  • 世界观天下!王龙威导演作品_王威 青年导演
    世界观天下!王龙威导演作品_王威 青年导演

  • 京山轻机2022年净利3.02亿同比增长107.04% 董事长李健薪酬33.12万
    京山轻机2022年净利3.02亿同比增长107.04% 董事长李健薪酬33.12万

  • 使用 Spring Cloud Bus 在微服务之间传递消息示例_热点聚焦
    使用 Spring Cloud Bus 在微服务之间传递消息示例_热点聚焦

  • 恒指期货手续费很贵_恒指期货手续费 焦点速看
    恒指期货手续费很贵_恒指期货手续费 焦点速看

  • 外媒:BuzzFeed将关闭新闻部门,裁员15%
    外媒:BuzzFeed将关闭新闻部门,裁员15%

  • 釜山行哪里可以下载_釜山行哪里可以看_环球报道
    釜山行哪里可以下载_釜山行哪里可以看_环球报道

  • 什么时吟凭栏处潇潇雨歇(凭栏处潇潇雨歇)-环球观点
    什么时吟凭栏处潇潇雨歇(凭栏处潇潇雨歇)-环球观点

  • Yearn社区发起推出LSD Token yETH的提案投票
    Yearn社区发起推出LSD Token yETH的提案投票

  • 045期樊可双色球预测奖号:红球三区分析
    045期樊可双色球预测奖号:红球三区分析

  • 冯仑:一线城市也会放开限购限售政策吗?
    冯仑:一线城市也会放开限购限售政策吗?

  • 天天观点:潮南仙湖景区_关于潮南仙湖景区介绍
    天天观点:潮南仙湖景区_关于潮南仙湖景区介绍

  • 北京互联网法院:数字教育著作权纠纷案件收案量增幅明显 新型侵权行为不断涌现
    北京互联网法院:数字教育著作权纠纷案件收案量增幅明显 新型侵权行为不断涌现

  • 4月21日基金净值:融通健康产业灵活配置混合A/B最新净值3.262,跌1.3%
    4月21日基金净值:融通健康产业灵活配置混合A/B最新净值3.262,跌1.3%

  • 沙士汽水配方_沙士汽水
    沙士汽水配方_沙士汽水

  • 大立科技(002214.SZ):一季度业绩预亏3900万元-5200万元
    大立科技(002214.SZ):一季度业绩预亏3900万元-5200万元

  • 速看:环球关注:全球时讯:宁夏特检院完成“宁马”特种设备安全保障工作
    速看:环球关注:全球时讯:宁夏特检院完成“宁马”特种设备安全保障工作

  • “引擎”加速,中国经济活力竞涌-当前动态
    “引擎”加速,中国经济活力竞涌-当前动态

  • 湖人VS灰熊G4时间确定:北京时间4月25日上午7点开打_环球热点评
    湖人VS灰熊G4时间确定:北京时间4月25日上午7点开打_环球热点评

  • 索尼互娱宣布收购游戏工作室Firewalk 环球观点
    索尼互娱宣布收购游戏工作室Firewalk 环球观点

  • 三从四德打一生肖是什么动物(三从四德打一生肖)
    三从四德打一生肖是什么动物(三从四德打一生肖)

  • 支持存量房“带押过户”!郑州住房公积金出台便民新举措 每日速递
    支持存量房“带押过户”!郑州住房公积金出台便民新举措 每日速递

  • 月经量很少是啥原因_月经量太少是怎么回事 世界时讯
    月经量很少是啥原因_月经量太少是怎么回事 世界时讯

  • 《八月未央》发布“原生家庭”版预告 钟楚曦谭松韵诠释宿命轮回
  • 《小舍得》蒋欣向佟大为请教育儿经 深耕教育与亲子关系的种种议题
  • 《指环王》临时撤档,原因让人难以接受,网友直言:心里没点数?
  • 《春光乍泄》里的秘密,王家卫隐藏20年终于解封了
  • papi酱不火了?主演电影票房口碑双扑街,网红和演员差距就在这了?
  • 《你好,李焕英》里最打动我的一句话:健康就好
  • 本以为是山寨版《大圣归来》,新版“西游记”竟然暗藏了这么多元素
  • 22亿差距,吴京再客串《我和我的父辈》距离沈腾正在逐渐缩小
  • 《猎鹰与冬兵》创作组曾多次修改莫泽男爵的结局
  • 电影里的经典台词:抓住幸福比忍耐痛苦更需要勇气
  • 胡杏儿发文宣布三胎得子 晒一家五口的手掌合照
  • 张柏芝被曝是投资能手 在北京上海拥有的房产价值超过两亿
  • 40岁金铭被嘲“童星陨落”像大妈 霸气回应:活成自己喜欢的样子
  • 吉克隽逸被尾随 张玮调侃“天黑看不到你”引网友不满
  • 龚俊感谢维基对其唱功的肯定 网友:开始循环播放了
  • 福原爱被曝搬离东京住所 背负着7400万日元房贷
  • 唐晓天方发文否认恋情 以后会注意文明举止
  • 李佳琦与“小助理”付鹏合开公司 李佳琦持股比例约38%
  • 黄俊捷前女友再发长文回顾风波 称自己被利用
  • 吴奇隆前妻马雅舒嫁外籍老公超幸福 近况曝光状态好
  • 王菲谢霆锋深夜会友同牵手 画面十分甜蜜自然
  • 丁太昇一语双关骂baby李菲儿,张大大砸灯为baby鸣不平
  • 冯女郎杨采钰与陈金飞疑分手 去年被曝已领证
  • 贾玲新戏拍摄引围观 一脸懵像没睡醒还被认成替身
  • 张翰罕见谈感情落泪 许多事情都没有第二次机会
  • 那英全家外出撸串 那英女儿穿着引热议
  • 张国荣《东邪西毒》第一个镜头首次曝光 出演角色“欧阳锋”
  • 王俊凯《重生之门》路透 大庭广众坐马桶搞笑又心酸
  • 电影《我的姐姐》走出国门 4月22日起将在北美、澳新上映
  • 厕所女王!水果姐曝美国偶像新造型写真 狂野造型回归
  • 梦回赵灵儿!刘亦菲《梦华录》曝路透 古装造型仙气十足
  • “海王”杰森·莫玛新片造型曝光 将于2022年登陆Netflix
  • 韩寒《年轻的故事》开拍 刘昊然新造型染棕色头发
  • 白敬亭新剧《八零九零》合作倪大红 对宣传话题提“特殊需求”
  • 潘玮柏否认“奉子成婚”后现身 眼含笑意似心情大好
  • 陈坤儿子陈尊佑晒与美女樱花树下合照 画面唯美
  • 白宇名誉权案一审胜诉 被告赔偿精神损害抚慰金2万元
  • 电影戏剧生活是共通的 每个演员都有高光时刻
  • 《你好生活》又开录?撒贝宁暴瘦成纸片人
  • 李克勤否认全家移民英国:很喜欢香港这个地方
  • 《创造营2021》第二次顺位出炉 吴宇恒第16名顺利晋级
  • 吕一小考成组内唯一获胜姐姐 无伴奏唱跳《日不落》很稳
  • 《秘境神草》第三季回归 揭开美好生活的密码
  • 《恰好是少年》定档4月11日 聚焦原生友情
  • 清明档票房创多项纪录《我的姐姐》成黑马
  • 《第一炉香》定档今夏 具体上映日期未公布
  • 对话《我的姐姐》导演殷若昕:希望能够展现爱的力量
  • 《十年一品温如言》定档国庆节 主演阵容公开
  • 港星爆料周星驰朱茵曾假戏真做秘密交往引热议
  • 胡杏儿分享三胎儿子子李奕宏出生细节 为照顾孩子宣布封肚
  • 消费者要用好预付卡冷静期 15日内可无理由要求退款
  • 线上订餐等新型消费发展进入快车道
  • 清明假期消费活跃 全国预计发送旅客1亿4452万人次
  • 盲盒消费易“上瘾”虽好玩也需谨慎对待
  • 空调产业结构加速升级 4月份或将迎来新一轮涨价
  • 没眼看,拉胯的特效,剧情离谱到突破天际……
  • 木村拓哉因疫情辞演美国电视剧,不得不放弃海外演出计划
  • 英国资深男演员因癌症去世 曾出演《哈利·波特与混血王子》《007》等著名影视剧
  • 67岁导演李安获“英国电影学院奖终身成就奖” 颁奖典礼将在4月11日进行
  • 32岁Baby穿豹纹裙显狂野气质,五官精致被形容像郭采洁
  • 音乐人最好的时代已至?做音乐不如扫大街?
  • 国内首部火箭军题材剧:李易峰担任男主 热血+颜值你期待吗?
  • 《王牌对王牌》靠卖弄情怀和回忆杀苦苦支撑,审美疲劳之下还能撑多久?
  • 一部热播三部待播的吴磊,端水行为情商热度暴涨
  • 《理想照耀中国》海报,杨采钰汪涵造型精致险些认不出来了
  • 《恋恋小酒窝》甜蜜进阶,霸总陆至翊壁咚吻狗粮洒满
  • 陈红吊打吴倩莲,张馨予吊打陈妍希,新《神雕侠侣》令人期待
  • 素描课拿“邓紫棋美照”当考题 超低分作品惊动本人:对不起他们的认真
  • 吴孟达,廖启智之后,下一位港星该谁了?
  • “歌仙”张国荣的传奇人生:像一根羽毛一样飞翔
  • 新加坡“最美黄蓉”何咏芳:90后心中的不老女神
  • 昔日的几位娱乐圈男神,如今面临秃顶危机甚至都开始戴假发了
  • 陈小纭自信能最终成团,如今靠努力再无容貌焦虑
  • 同是演乞丐:周星驰用手抓饭,刘德华落魄睡大街,只有她是来搞笑的
  • 张柏芝真是老天喂饭吃,穿死亡芭比粉依旧高挑有魅力
  • 范冰冰罕换风格,挽起长发穿职业装知性干练令人羡慕
  • 赵丽颖自然之灵时尚大片,颜值与气质兼具展现独特个人风采
  • 李宇春化身“青春学姐”,学院风制服搭小腿袜活力满满
  • 今春火了一种裤子!“例假裤”遮肉显瘦又时髦你穿了没?
  • 张小斐带火了一种穿法:衬衫+老头衫气质满满
  • 王子文个子小但比例协调!穿蓬蓬袖上衣配高腰裤高挑有魅力
  • 23岁窦靖童新造型大突破,穿露背裙涂大红唇拍戏女生都看入迷了
  • 一字肩白色上衣搭配浅蓝色牛仔短裤 简约时尚青春靓丽
  • 穿出风格才是高手!时尚博主教你“衬衫穿搭术”:如何穿出高级的优雅感
  • 66岁赵雅芝还有“葫芦身材”!穿斜肩紧身裙配金项链优雅又有型
  • 京东数科科创板IPO终止审核 后续IPO计划或更有利于估值
  • 家电业多渠道融合成常态 创新零售加快改革步伐
  • 中国小家电海外需求急速攀升,成长潜力巨大
  • 开机广告不可关闭侵犯消费者权益,应能“一键关闭”
  • 零售 多商圈人气火爆 “换季”“踏青”“尝鲜”等主题消费加速回暖
  • 大热美剧《老爸老妈浪漫史》拍续集 Hulu预定一季10集
  • 刘亦菲晒针灸照脖子扎满针 网友:心疼女神
  • 德云社相声演员烧饼宣布二胎得子 小儿子叫"饼干"
  • 宋佳直言“佛系妈妈”不好演 好好生活才能演好戏
  • 经典网文IP影视化 如何让观众对内容深度认同?
  • 我们都是讲故事的人
  • 悬疑网剧《暗房》定档9.22,真实揭秘“校园裸贷”真相
  • 一起围观“柠檬夫妇”酸酸甜甜的恋爱风暴!
  • 上头甜剧《柠檬树上你和我》即将上线!来看看学霸们是如何恋爱的吧!
  • 《柠檬树上你和我》超甜通勤剧,婚恋爱情手册。
亚洲娱乐网