From 38d8a3756c80686e9c8df9609cbf7ae825030e1d Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Wed, 14 Oct 2020 17:55:49 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20decimal=3F=20=E5=8F=AF?= =?UTF-8?q?=E7=A9=BA=E6=95=B0=E5=AD=97=E8=AE=BE=E7=BD=AE=20Column=20Scale?= =?UTF-8?q?=20=E6=97=A0=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98(decimal?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8)=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 16 ++ FreeSql.Tests/FreeSql.Tests/UnitTest3.cs | 25 +- FreeSql/FreeSql.xml | 347 ++++++++++++----------- FreeSql/Internal/UtilsExpressionTree.cs | 6 +- 4 files changed, 221 insertions(+), 173 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index d198eb6c..ce9ce69d 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -130,6 +130,13 @@ 清空状态数据 + + + 根据 lambda 条件删除数据 + + + + 添加 @@ -525,5 +532,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs index 2898efc6..e60d9450 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs @@ -156,18 +156,21 @@ namespace FreeSql.Tests } } -class testInsertNullable -{ - [Column(IsNullable = false, IsIdentity = true)] - public long Id { get; set; } + class testInsertNullable + { + [Column(IsNullable = false, IsIdentity = true)] + public long Id { get; set; } - [Column(IsNullable = false)] - public string str1 { get; set; } - [Column(IsNullable = false)] - public int? int1 { get; set; } - [Column(IsNullable = true)] - public int int2 { get; set; } -} + [Column(IsNullable = false)] + public string str1 { get; set; } + [Column(IsNullable = false)] + public int? int1 { get; set; } + [Column(IsNullable = true)] + public int int2 { get; set; } + + [Column(Precision = 10, Scale = 5)] + public decimal? price { get; set; } + } class testUpdateNonePk { diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 8fd7f738..c65b9fa8 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2997,154 +2997,6 @@ - - - 测试数据库是否连接正确,本方法执行如下命令: - MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 - Oracle: SELECT 1 FROM dual - - 命令超时设置(秒) - true: 成功, false: 失败 - - - - 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 - - - - - - - - - 查询,ExecuteReaderAsync(dr => {}, "select * from user where age > ?age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - 查询 - - - - - - - 查询,ExecuteArrayAsync("select * from user where age > ?age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 查询 - - - - - - - 查询,ExecuteDataSetAsync("select * from user where age > ?age; select 2", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 查询 - - - - - - - 查询,ExecuteDataTableAsync("select * from user where age > ?age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 在【主库】执行 - - - - - - - - 在【主库】执行,ExecuteNonQueryAsync("delete from user where age > ?age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 在【主库】执行 - - - - - - - - 在【主库】执行,ExecuteScalarAsync("select 1 from user where age > ?age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > ?age", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - 执行SQL返回对象集合,QueryAsync<User>("select * from user where age > ?age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > ?age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - 执行SQL返回对象集合,Query<User, Address>("select * from user where age > ?age; select * from address", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - 可自定义解析表达式 @@ -3951,12 +3803,6 @@ 超时 - - - 获取资源 - - - 使用完毕后,归还资源 @@ -4027,12 +3873,6 @@ 资源对象 - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - 归还对象给对象池的时候触发 @@ -4643,3 +4483,190 @@ +essions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}})"> + + 使用 and 拼接两个 lambda 表达式 + + + + + + 使用 and 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 将 lambda 表达式取反 + + + true 时生效 + + + + + 生成类似Mongodb的ObjectId有序、不重复Guid + + + + + + 插入数据 + + + + + + + 插入数据,传入实体 + + + + + + + + 插入数据,传入实体数组 + + + + + + + + 插入数据,传入实体集合 + + + + + + + + 插入数据,传入实体集合 + + + + + + + + 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: + MySql 5.6+: on duplicate key update + PostgreSQL 9.4+: on conflict do update + SqlServer 2008+: merge into + Oracle 11+: merge into + Sqlite: replace into + 达梦: merge into + 人大金仓:on conflict do update + 神通:merge into + MsAccess:不支持 + 注意区别:FreeSql.Repository 仓储也有 InsertOrUpdate 方法(不依赖数据库特性) + + + + + + + 修改数据 + + + + + + + 修改数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} + + + 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 + + + + + 查询数据 + + + + + + + 查询数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} + + + 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 + + + + + 删除数据 + + + + + + + 删除数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} + + + 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 + + + + + 开启事务(不支持异步) + v1.5.0 关闭了线程事务超时自动提交的机制 + + 事务体 () => {} + + + + 开启事务(不支持异步) + v1.5.0 关闭了线程事务超时自动提交的机制 + + + 事务体 () => {} + + + + 数据库访问对象 + + + + + 所有拦截方法都在这里 + + + + + CodeFirst 模式开发相关方法 + + + + + DbFirst 模式开发相关方法 + + + + + 全局过滤设置,可默认附加为 Select/Update/Delete 条件 + + + + diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 148ac6c4..0d286190 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -228,7 +228,7 @@ namespace FreeSql.Internal col.DbDefaultValue = colattr.InsertValueSql; col.DbInsertValue = colattr.InsertValueSql; } - if (colattr.MapType == typeof(string) && colattr.StringLength != 0) + if (colattr.MapType.NullableTypeOrThis() == typeof(string) && colattr.StringLength != 0) { int strlen = colattr.StringLength; var charPatten = @"(CHARACTER|CHAR2|CHAR)\s*(\([^\)]*\))?"; @@ -328,8 +328,10 @@ namespace FreeSql.Internal break; } } - if (colattr.MapType == typeof(decimal) && colattr.Precision > 0) + if (colattr.MapType.NullableTypeOrThis() == typeof(decimal) && (colattr.Precision > 0 || colattr.Scale > 0)) { + if (colattr.Precision <= 0) colattr.Precision = 10; + if (colattr.Scale <= 0) colattr.Scale = 0; var decimalPatten = @"(DECIMAL|NUMERIC|NUMBER)\s*(\([^\)]*\))?"; colattr.DbType = Regex.Replace(colattr.DbType, decimalPatten, $"$1({colattr.Precision},{colattr.Scale})"); }