diff --git a/Directory.Build.props b/Directory.Build.props index 5449bdf7..0e767cb6 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -11,7 +11,7 @@ diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index 90faadca..901ac49f 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index cfbbc4fd..b6c39a34 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -19,7 +19,7 @@ key.snk false latest - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index fdd75c26..740ea3b0 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 22d3a95a..ad72d76d 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 2f52ec7e..812af376 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index a0551c90..06915e6d 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index 751e5fc1..bed57b3b 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index 8f6fdc38..b52240ce 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 2642aef6..b90751b2 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index dfe54547..f73656c3 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -17,7 +17,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 48207741..b3501e4a 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1,6051 +1,6034 @@ - - - - FreeSql - - - - - 数据库列名 - - - - - 指定数据库旧的列名,修改实体属性命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库字段;否则将视为【新增字段】 - - - - - 数据库类型,如: varchar(255) - 字符串长度,可使用特性 [MaxLength(255)] - - - - - 主键 - - - - - 自增标识 - - - - - 是否可DBNull - - - - - 忽略此列,不迁移、不插入 - - - - - 设置行锁(乐观锁)版本号,每次更新累加版本号,若更新整个实体时会附带当前的版本号判断(修改失败时抛出异常) - - - - - 类型映射,除了可做基本的类型映射外,特别介绍的功能: - 1、将 enum 属性映射成 typeof(string) - 2、将 对象 属性映射成 typeof(string),请安装扩展包 FreeSql.Extensions.JsonMap - - - - - 创建表时字段的位置(场景:实体继承后设置字段顺序),规则如下: - - >0时排前面,1,2,3... - - =0时排中间(默认) - - <0时排后面,...-3,-2,-1 - - - - - 该字段是否可以插入,默认值true,指定为false插入时该字段会被忽略 - - - - - 该字段是否可以更新,默认值true,指定为false更新时该字段会被忽略 - - - - - 标记属性为数据库服务器时间(utc/local),在插入的时候使用类似 getdate() 执行 - - - - - 设置长度,针对 string/byte[] 类型避免 DbType 的繁琐设置 - 提示:也可以使用 [MaxLength(100)] - --- - StringLength = 100 时,对应 DbType: - MySql -> varchar(100) - SqlServer -> nvarchar(100) - PostgreSQL -> varchar(100) - Oracle -> nvarchar2(100) - Sqlite -> nvarchar(100) - --- - StringLength < 0 时,对应 DbType: - MySql -> text (StringLength = -2 时,对应 longtext) - SqlServer -> nvarchar(max) - PostgreSQL -> text - Oracle -> nclob - Sqlite -> text - v1.6.0+ byte[] 支持设置 StringLength - - - - - 执行 Insert 方法时使用此值 - 注意:如果是 getdate() 这种请可考虑使用 ServerTime,因为它对数据库间作了适配 - - - - - decimal/numeric 类型的长度 - - - - - decimal/numeric 类型的小数位长度 - - - - - 重写功能 - 比如:[Column(RewriteSql = "geography::STGeomFromText({0},4236)")] - 插入:INSERT INTO [table]([geo]) VALUES(geography::STGeomFromText('...',4236)) - 提示:更新也生效 - - - - - 重读功能 - 比如:[Column(RereadSql = "{0}.STAsText()")] - 查询:SELECT a.[id], a.[geo].STAsText() FROM [table] a - - - - - 数据库列名 - - - - - 指定数据库旧的列名,修改实体属性命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库字段;否则将视为【新增字段】 - - - - - 数据库类型,如: varchar(255) - - - - - 主键 - - - - - 自增标识 - - - - - 是否可DBNull - - - - - 忽略此列,不迁移、不插入 - - - - - 乐观锁 - - - - - 类型映射,比如:可将 enum 属性映射成 typeof(string) - - - - - - - 创建表时字段位置,规则如下: - - >0时排前面 - - =0时排中间(默认) - - <0时排后面 - - - - - - - 该字段是否可以插入,默认值true,指定为false插入时该字段会被忽略 - - - - - - - 该字段是否可以更新,默认值true,指定为false更新时该字段会被忽略 - - - - - - - 标记属性为数据库服务器时间(utc/local),在插入的时候使用类似 getdate() 执行 - - - - - - - 设置长度,针对 string 类型避免 DbType 的繁琐设置 - --- - StringLength = 100 时,对应 DbType: - MySql -> varchar(100) - SqlServer -> nvarchar(100) - PostgreSQL -> varchar(100) - Oracle -> nvarchar2(100) - Sqlite -> nvarchar(100) - --- - StringLength = -1 时,对应 DbType: - MySql -> text - SqlServer -> nvarchar(max) - PostgreSQL -> text - Oracle -> nvarchar2(4000) - Sqlite -> text - - - - - 执行 Insert 方法时使用此值 - 注意:如果是 getdate() 这种请可考虑使用 ServerTime,因为它对数据库间作了适配 - - - - - - - decimal/numeric 类型的长度/小数位长度 - - 总长度 - 小数位长度 - - - - - 重写功能 - 比如:[Column(RewriteSql = "geography::STGeomFromText({0},4236)")] - 插入:INSERT INTO [table]([geo]) VALUES(geography::STGeomFromText('...',4236)) - 提示:更新也生效 - - - - - - - 重读功能 - 比如:[Column(RereadSql = "{0}.STAsText()")] - 查询:SELECT a.[id], a.[geo].STAsText() FROM [table] a - - - - - - - 自定义表达式函数解析 - 注意:请使用静态方法、或者在类上标记 - - - - - 自定义表达式函数解析的时候,指定参数不解析 SQL,而是直接传进来 - - - - - 数据库类型,可用于适配多种数据库环境 - - - - - 已解析的表达式中参数内容 - - - - - 表达式原始值 - - - - - 主对象的参数化对象,可重塑其属性 - - - - - 可附加参数化对象 - 注意:本属性只有 Where 的表达式解析才可用 - - - - - 将 c# 对象转换为 SQL - - - - - 返回表达式函数表示的 SQL 字符串 - - - - - 获取实体元数据 - - - - - - - 解析表达式 - - - - - - - (非公开)内部公共工具类方法 - - - - - 索引设置,如:[Index("{tablename}_idx_01", "name")] - - - - - 索引设置,如:[Index("{tablename}_idx_01", "name")] - - 索引名v1.7.0 增加占位符 {TableName} 表名区分索引名 (解决 AsTable 分表 CodeFirst 导致索引名重复的问题) - 索引字段,为属性名以逗号分隔,如:Create_time ASC, Title ASC - - - - 索引设置,如:[Index("{tablename}_idx_01", "name", true)] - - 索引名v1.7.0 增加占位符 {TableName} 表名区分索引名 (解决 AsTable 分表 CodeFirst 导致索引名重复的问题) - 索引字段,为属性名以逗号分隔,如:Create_time ASC, Title ASC - 是否唯一 - - - - 索引名 - v1.7.0 增加占位符 {TableName} 表名区分索引名 (解决 AsTable 分表 CodeFirst 导致索引名重复的问题) - - - - - 索引字段,为属性名以逗号分隔,如:Create_time ASC, Title ASC - - - - - 是否唯一 - - - - - OneToOne:[Navigate(nameof(Primary))] <-> (缺省)外表.Primary - ManyToOne:Topic.cs 文件 [Navigate(nameof(Topic.CategoryId))] <-> (缺省)Category.Id - _________________public Category Category { get; set; } - OneToMany:Category.cs 文件 (缺省)Category.Id <-> [Navigate(nameof(Topic.CategoryId))] - _________________public List<Topic> Topics { get; set; } - - - - - OneToOne:[Navigate(nameof(Primary))] <-> (缺省)外表.Primary - ManyToOne:Topic.cs 文件 [Navigate(nameof(Topic.CategoryId))] <-> (缺省)Category.Id - _________________public Category Category { get; set; } - OneToMany:Category.cs 文件 (缺省)Category.Id <-> [Navigate(nameof(Topic.CategoryId))] - _________________public List<Topic> Topics { get; set; } - - - - - 与非主键进行关联,仅支持 OneToMany、ManyToOne - 使用方法参考 Bind 属性 - - - - - 手工绑定 ManyToMany 导航关系 - - - - - OneToOne:[Navigate(nameof(Primary))] <-> (缺省)外表.Primary - ManyToOne:Topic.cs 文件 [Navigate(nameof(Topic.CategoryId))] <-> (缺省)Category.Id - _________________public Category Category { get; set; } - OneToMany:Category.cs 文件 (缺省)Category.Id <-> [Navigate(nameof(Topic.CategoryId))] - _________________public List<Topic> Topics { get; set; } - - - - - 主键名 - - - - - 数据库表名 - - - - - 指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】 - - - - - 禁用 CodeFirst 同步结构迁移 - - - - - 格式:属性名=开始时间(递增) - 按年分表:[Table(Name = "log_{yyyy}", AsTable = "create_time=2022-1-1(1 year)")] - 按月分表:[Table(Name = "log_{yyyyMM}", AsTable = "create_time=2022-5-1(1 month)")] - 按日分表:[Table(Name = "log_{yyyyMMdd}", AsTable = "create_time=2022-5-1(5 day)")] - 按时分表:[Table(Name = "log_{yyyyMMddHH}", AsTable = "create_time=2022-5-1(6 hour)")] - - - - - 可以匹配以下条件(支持参数化): - `field` BETWEEN '2022-01-01 00:00:00' AND '2022-03-01 00:00:00' - `field` > '2022-01-01 00:00:00' AND `field` < '2022-03-01 00:00:00' - `field` > '2022-01-01 00:00:00' AND `field` <= '2022-03-01 00:00:00' - `field` >= '2022-01-01 00:00:00' AND `field` < '2022-03-01 00:00:00' - `field` >= '2022-01-01 00:00:00' AND `field` <= '2022-03-01 00:00:00' - `field` > '2022-01-01 00:00:00' - `field` >= '2022-01-01 00:00:00' - `field` < '2022-01-01 00:00:00' - `field` <= '2022-01-01 00:00:00' - - - - - - - 数据库表名 - - - - - 指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】 - - - - - 禁用 CodeFirst 同步结构迁移 - - - - - 导航关系Fluent,与 NavigateAttribute 对应 - - - - 多对多关系的中间实体类型 - - - - - 设置实体的索引 - - 索引名 - 索引字段,为属性名以逗号分隔,如:Create_time ASC, Title ASC - 是否唯一 - - - - - 数据库表名 - - - - - 指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】 - - - - - 禁用 CodeFirst 同步结构迁移 - - - - - 导航关系Fluent,与 NavigateAttribute 对应 - - - - - 多对多关系的中间实体类型 - - - - - 设置实体的索引 - - 索引名 - 索引字段,为属性名以逗号分隔,如:Create_time ASC, Title ASC - 是否唯一 - - - - - 所属表 - - - - - 列名 - - - - - 映射到 C# 类型 - - - - - 数据库枚举类型int值 - - - - - 数据库类型,字符串,varchar - - - - - 数据库类型,字符串,varchar(255) - - - - - 最大长度 - - - - - 主键 - - - - - 自增标识 - - - - - 是否可DBNull - - - - - 备注,早期编码时少按了一个字母,请使用 Comment - - - - - 备注 - - - - - 数据库默认值 - - - - - 字段位置 - - - - - 枚举类型标识 - - - - - 枚举项 - - - - - 唯一标识 - - - - - SqlServer下是Owner、PostgreSQL下是Schema、MySql下是数据库名 - - - - - 表名 - - - - - 表备注,SqlServer下是扩展属性 MS_Description - - - - - 表/视图 - - - - - 列 - - - - - 自增列 - - - - - 主键/组合 - - - - - 唯一键/组合 - - - - - 索引/组合 - - - - - 外键 - - - - - 类型标识 - - - - - 枚举项 - - - - - 通用的 Odbc 实现,只能做基本的 Crud 操作 - 不支持实体结构迁移、不支持分页(只能 Take 查询) - - 通用实现为了让用户自己适配更多的数据库,比如连接 mssql 2000、db2 等数据库 - 默认适配 SqlServer,可以继承后重新适配 FreeSql.Odbc.Default.OdbcAdapter,最好去看下代码 - - 适配新的 OdbcAdapter,请在 FreeSqlBuilder.Build 之后调用 IFreeSql.SetOdbcAdapter 方法设置 - - - - - 武汉达梦数据库有限公司,基于 Odbc 的实现 - - - - - Microsoft Office Access 是由微软发布的关联式数据库管理系统 - - - - - 武汉达梦数据库有限公司,基于 DmProvider.dll 的实现 - - - - - 北京人大金仓信息技术股份有限公司,基于 Odbc 的实现 - - - - - 天津神舟通用数据技术有限公司,基于 System.Data.OscarClient.dll 的实现 - - - - - 北京人大金仓信息技术股份有限公司,基于 Kdbndp.dll 的实现 - - - - - Firebird 是一个跨平台的关系数据库,能作为多用户环境下的数据库服务器运行,也提供嵌入式数据库的实现 - - - - - 自定义适配器,访问任何数据库 - 注意:该类型不提供 DbFirst/CodeFirst 功能 - - - - - 天津南大通用数据技术股份有限公司成立于2004年,是国产数据库、大数据领域的知名企业,基于 Odbc 的实现 - - - - - 获取 IDbConnection 对应的 IFreeSql 实例 - - - - - - - 插入数据 - - - - - - - 插入数据,传入实体 - - - - - - - - - 插入数据,传入实体数组 - - - - - - - - - 插入数据,传入实体集合 - - - - - - - - - 插入数据,传入实体集合 - - - - - - - - - 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: - 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 - Firebird: merge 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} - - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 多表查询 - - - - - - - 多表查询 - - - - - - - 多表查询 - - - - - - - 多表查询 - - - - - - - 多表查询 - - - - - - - 多表查询 - - - - - - - 多表查询 - - - - - - - 多表查询 - - - - - - - 多表查询 - - - - - - - 插入数据 - - - - - - - 插入数据,传入实体 - - - - - - - - - 插入数据,传入实体数组 - - - - - - - - - 插入数据,传入实体集合 - - - - - - - - - 插入数据,传入实体集合 - - - - - - - - - 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: - 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} - - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 多表查询 - - - - - - 多表查询 - - - - - - 多表查询 - - - - - - 多表查询 - - - - - - 多表查询 - - - - - - 多表查询 - - - - - - 多表查询 - - - - - - 多表查询 - - - - - - 多表查询 - - - - - - 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null - - - - - 当Guid无值时,会生成有序的新值 - - - - - - 获取实体的主键值,多个主键返回数组 - - - - - - - - - 获取实体的属性值 - - - - - - - - - - 获取实体的所有数据,以 (1, 2, xxx) 的形式 - - - - - - - - - 使用新实体的值,复盖旧实体的值 - - - - - 使用新实体的主键值,复盖旧实体的主键值 - - - - - 设置实体中主键内的自增字段值(若存在) - - - - - - - - - 获取实体中主键内的自增字段值(若存在) - - - - - - - - 清除实体的主键值,将自增、Guid类型的主键值清除 - - - - - - - - 清除实体的主键值,将自增、Guid类型的主键值清除 - - - - - - - - 对比两个实体值,返回相同/或不相同的列名 - - - - - - - - - - - 设置实体中某属性的数值增加指定的值 - - - - - - - - - - 设置实体中某属性的值 - - - - - - - - - - 缓存执行 IUpdate.Set - - - - - - - - - SqlExt 是利用自定表达式函数解析功能,解析默认常用的SQL函数,欢迎 PR - - - - - rank() over(order by ...) - - - - - - dense_rank() over(order by ...) - - - - - - count() over(order by ...) - - - - - - sum(..) over(order by ...) - - - - - - - avg(..) over(order by ...) - - - - - - max(..) over(order by ...) - - - - - - - - min(..) over(order by ...) - - - - - - - - SqlServer row_number() over(order by ...) - - - - - - isnull、ifnull、coalesce、nvl - - - - - - - - - count(distinct name) - - - - - - - - 注意:使用者自己承担【注入风险】 - - - - - - - 大于 > - - - - - - 大于或等于 >= - - - - - - 小于 < - - - - - - 小于或等于 <= - - - - - - case when .. then .. end - - - - - - case when .. then .. end - - - - - - - - - - MySql group_concat(distinct .. order by .. separator ..) - - - - - - - MySql find_in_set(str, strlist) - - - - - - - - - PostgreSQL string_agg(.., ..) - - - - - - - - 使用连接串(推荐) - - 数据库类型 - 数据库连接串 - 提供者的类型,一般不需要指定,如果一直提示“缺少 FreeSql 数据库实现包:FreeSql.Provider.MySql.dll,可前往 nuget 下载”的错误,说明反射获取不到类型,此时该参数可排上用场例如:typeof(FreeSql.SqlServer.SqlServerProvider<>) - - - - - 使用从数据库,支持多个 - - 从数据库连接串 - - - - - 使用自定义数据库连接对象(放弃内置对象连接池技术) - - 数据库类型 - 数据库连接对象创建器 - 提供者的类型,一般不需要指定,如果一直提示“缺少 FreeSql 数据库实现包:FreeSql.Provider.MySql.dll,可前往 nuget 下载”的错误,说明反射获取不到类型,此时该参数可排上用场例如:typeof(FreeSql.SqlServer.SqlServerProvider<>) - - - - - 【开发环境必备】自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改 - 注意:生产环境中谨慎使用 - - true:运行时检查自动同步结构, false:不同步结构(默认) - - - - - 将数据库的主键、自增、索引设置导入,适用 DbFirst 模式,无须在实体类型上设置 [Column(IsPrimary)] 或者 ConfigEntity。此功能目前可用于 mysql/sqlserver/postgresql/oracle。 - 本功能会影响 IFreeSql 首次访问的速度。 - 若使用 CodeFirst 创建索引后,又直接在数据库上建了索引,若无本功能下一次 CodeFirst 迁移时数据库上创建的索引将被删除 - - - - - - - 不使用命令参数化执行,针对 Insert/Update,也可临时使用 IInsert/IUpdate.NoneParameter() - - - - - - - 是否生成命令参数化执行,针对 lambda 表达式解析 - 注意:常量不会参数化,变量才会做参数化 - var id = 100; - fsql.Select<T>().Where(a => a.id == id) 会参数化 - fsql.Select<T>().Where(a => a.id == 100) 不会参数化 - - - - - - - 延时加载导航属性对象,导航属性需要声明 virtual - - - - - - - 监视数据库命令对象 - - 执行前 - 执行后,可监视执行性能 - - - - - 实体类名 -> 数据库表名,命名转换(类名、属性名都生效) - 优先级小于 [Column(Name = "xxx")] - - - - - - - SQL名称是否使用 [] `` "" - true: SELECT .. FROM [table] - false: SELECT .. FROM table - - - - - - - 指定映射优先级 - 例如表名:实体类名 < Aop < FluentApi < Attribute < AsTable - 事件 Aop -------> fsql.Aop.ConfigEntity/fsql.Aop.ConfigEntityProperty - 方法 FluentApi -> fsql.CodeFirst.ConfigEntity/fsql.CodeFirst.Entity - 特性 Attribute -> [Table(Name = xxx, ...)] - ----------------------------------------------------------------------------- - 默认规则:关于映射优先级,Attribute 可以更直观排查问题,即使任何地方使用 FluentApi/Aop 设置 TableName 都不生效。 - 调整规则:UseMappingPriority(Attribute, FluentApi, Aop) - 实体类名 < Attribute < FluentApi < Aop < AsTable - - - - - - - - - - 监听 AppDomain.CurrentDomain.ProcessExit/Console.CancelKeyPress 事件自动释放连接池 - 默认值: true - - - - - - - 指定事务对象 - - - - - - - 指定事务对象 - - - - - - - 命令超时设置(秒) - - - - - - - lambda表达式条件,仅支持实体基础成员(不包含导航对象) - 若想使用导航对象,请使用 ISelect.ToDelete() 方法 - - lambda表达式条件 - - - - - lambda表达式条件,仅支持实体基础成员(不包含导航对象) - 若想使用导航对象,请使用 ISelect.ToUpdate() 方法 - - true 时生效 - lambda表达式条件 - - - - - 原生sql语法条件,Where("id = @id", new { id = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - sql语法条件 - 参数 - - - - - 原生sql语法条件,Where("id = @id", new { id = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - true 时生效 - sql语法条件 - 参数 - - - - - 传入实体,将主键作为条件 - - 实体 - - - - - 传入实体集合,将主键作为条件 - - 实体集合 - - - - - 传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - 是否标识为NOT - - - - - 禁用全局过滤功能,不传参数时将禁用所有 - - 零个或多个过滤器名字 - - - - - 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; - - - - - - - 设置表名 - - - - - - - 动态Type,在使用 Delete<object> 后使用本方法,指定实体类型 - - - - - - - 返回即将执行的SQL语句 - - - - - - 执行SQL语句,返回影响的行数 - - - - - - 执行SQL语句,返回被删除的记录 - 注意:此方法只有 Postgresql/SqlServer 有效果 - - - - - - 指定事务对象 - - - - - - - 指定事务对象 - - - - - - - 命令超时设置(秒) - - - - - - - 追加准备插入的实体 - - 实体 - - - - - 追加准备插入的实体 - - 实体 - - - - - 追加准备插入的实体集合 - - 实体集合 - - - - - 只插入的列,InsertColumns(a => a.Name) | InsertColumns(a => new{a.Name,a.Time}) | InsertColumns(a => new[]{"name","time"}) - - lambda选择列 - - - - - 只插入的列 - - 属性名,或者字段名 - - - - - 忽略的列,IgnoreColumns(a => a.Name) | IgnoreColumns(a => new{a.Name,a.Time}) | IgnoreColumns(a => new[]{"name","time"}) - - lambda选择列 - - - - - 忽略的列 - - 属性名,或者字段名 - - - - - 指定可插入自增字段 - - - - - - 不使用参数化,可通过 IFreeSql.CodeFirst.IsNotCommandParameter 全局性设置 - - 是否不使用参数化 - - - - - 批量执行选项设置,一般不需要使用该方法 - 各数据库 values, parameters 限制不一样,默认设置: - MySql 5000 3000 - PostgreSQL 5000 3000 - SqlServer 1000 2100 - Oracle 500 999 - Sqlite 5000 999 - 若没有事务传入,内部(默认)会自动开启新事务,保证拆包执行的完整性。 - - 指定根据 values 上限数量拆分执行 - 指定根据 parameters 上限数量拆分执行 - 是否自动开启事务 - - - - - 批量执行时,分批次执行的进度状态 - - 批量执行时的回调委托 - - - - - 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; - - - - - - - 设置表名 - - - - - - - 动态Type,在使用 Insert<object> 后使用本方法,指定实体类型 - - - - - - - 返回即将执行的SQL语句 - - - - - - 执行SQL语句,返回影响的行数 - - - - - - 执行SQL语句,返回自增值 - 注意:请检查实体类是否标记了 [Column(IsIdentity = true)] - - - - - - 执行SQL语句,返回插入后的记录 - 注意:此方法只有 Postgresql/SqlServer 有效果 - - - - - - 返回 DataTable 以便做 BulkCopy 数据做准备 - 此方法会处理: - 类型、表名、字段名映射 - IgnoreColumns、InsertColumns - - - - - - 指定事务对象 - - - - - - - 指定事务对象 - - - - - - - 命令超时设置(秒) - - - - - - - 添加或更新,设置实体 - - 实体 - - - - - 添加或更新,设置实体 - - 实体 - - 根据临时主键插入或更新,a => a.Name | a => new{a.Name,a.Time} | a => new[]{"name","time"} - 注意:不处理自增,因某些数据库依赖主键或唯一键,所以指定临时主键仅对 SqlServer/PostgreSQL/Firebird/达梦/南大通用/金仓/神通 有效 - - - - - - 添加或更新,设置实体集合 - - 实体集合 - - 根据临时主键插入或更新,a => a.Name | a => new{a.Name,a.Time} | a => new[]{"name","time"} - 注意:不处理自增,因某些数据库依赖主键或唯一键,所以指定临时主键仅对 SqlServer/PostgreSQL/Firebird/达梦/南大通用/金仓/神通 有效 - - - - - - 添加或更新,设置SQL - - 查询SQL - - 根据临时主键插入或更新,a => a.Name | a => new{a.Name,a.Time} | a => new[]{"name","time"} - 注意:不处理自增,因某些数据库依赖主键或唯一键,所以指定临时主键仅对 SqlServer/PostgreSQL/Firebird/达梦/南大通用/金仓/神通 有效 - - - - - - 当记录存在时,什么都不做 - 换句话:只有记录不存在时才插入 - - - - - - 当记录存在时,指定只更新的字段,UpdateColumns(a => a.Name) | UpdateColumns(a => new{a.Name,a.Time}) | UpdateColumns(a => new[]{"name","time"}) - - lambda选择列 - - - - - 当记录存在时,指定只更新的字段 - - 属性名,或者字段名 - - - - - 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; - - - - - - - 设置表名 - - - - - - - 动态Type,在使用 Update<object> 后使用本方法,指定实体类型 - - - - - - - 返回即将执行的SQL语句 - - - - - - 执行SQL语句,返回影响的行数 - - - - - - 自动产生 as1, as2, as3 .... 字段别名 - 这种方法可以最大程度防止多表,存在相同字段的问题 - - - - - 使用属性名作为字段别名 - - - - - 控制取消本次查询 - * 不会产生额外的异常 - * 取消成功,则不执行 SQL 命令 - * 取消成功,直接返回没有记录时候的返回值 - * 取消成功,如 List<T> 返回 0 元素列表,不是 null,仍然是旧机制 - - 返回 true,则不会执行 SQL 命令 - - - - - 指定事务对象 - - - - - - - 指定连接对象 - - - - - - - 使用自定义参数化,UnionALL 或者 ToSql 可能有需要 - - - - - - - 命令超时设置(秒) - - - - - - - 审核或跟踪 ToList 即将返回的数据 - - - - - - - 执行SQL查询,返回 DataTable - - - - - - 执行SQL查询,返回 properties 指定的实体类属性,并以 DataTable 接收 - - 属性名:Name导航属性:Parent.Name多表:b.Name - - - - - 以字典的形式返回查询结果 - 注意:字典的特点会导致返回的数据无序 - - - - - - - - 执行SQL查询,返回 T1 实体所有字段的记录,记录不存在时返回 Count 为 0 的列表 - 注意: - 1、ToList(a => a) 可以返回 a 所有实体 - 2、ToList(a => new { a }) 这样也可以 - 3、ToList((a, b, c) => new { a, b, c }) 这样也可以 - 4、abc 怎么来的?请试试 fsql.Select<T1, T2, T3>() - - - - - - 执行SQL查询,返回 T1 实体、以及 LeftJoin/InnerJoin/RightJoin 对象 - - false: 返回 2级 LeftJoin/InnerJoin/RightJoin 对象;true: 返回所有 LeftJoin/InnerJoin/RightJoin 的导航数据 - - - - - 执行SQL查询,分块返回数据,可减少内存开销。比如读取10万条数据,每次返回100条处理。 - - 数据块的大小 - 处理数据块 - false: 返回 2级 LeftJoin/InnerJoin/RightJoin 对象;true: 返回所有 LeftJoin/InnerJoin/RightJoin 的导航数据 - - - - 执行SQL查询,返回 field 指定字段的记录,并以元组或基础类型(int,string,long)接收,记录不存在时返回 Count 为 0 的列表 - - - - - - - - 执行SQL查询,返回 T1 实体所有字段的第一条记录,记录不存在时返回 null - - - - - - 执行SQL查询,返回 T1 实体所有字段的第一条记录,记录不存在时返回 null - - - - - - 将查询转为删除对象,以便支持导航对象或其他查询功能删除数据,如下: - fsql.Select<T1>().Where(a => a.Options.xxx == 1).ToDelete().ExecuteAffrows() - 注意:此方法不是将数据查询到内存循环删除,上面的代码产生如下 SQL 执行: - DELETE FROM `T1` WHERE id in (select a.id from T1 a left join Options b on b.t1id = a.id where b.xxx = 1) - 复杂删除使用该方案的好处: - 1、删除前可预览测试数据,防止错误删除操作; - 2、支持更加复杂的删除操作(IDelete 默认只支持简单的操作); - - - - - - 将查询转为更新对象,以便支持导航对象或其他查询功能更新数据,如下: - fsql.Select<T1>().Where(a => a.Options.xxx == 1).ToUpdate().Set(a => a.Title, "111").ExecuteAffrows() - 注意:此方法不是将数据查询到内存循环更新,上面的代码产生如下 SQL 执行: - UPDATE `T1` SET Title = '111' WHERE id in (select a.id from T1 a left join Options b on b.t1id = a.id where b.xxx = 1) - 复杂更新使用该方案的好处: - 1、更新前可预览测试数据,防止错误更新操作; - 2、支持更加复杂的更新操作(IUpdate 默认只支持简单的操作); - - - - - - 设置表名规则,可用于分库/分表,参数1:实体类型;参数2:默认表名;返回值:新表名; - 设置多次,可查询分表后的多个子表记录,以 UNION ALL 形式执行。 - 如:select.AsTable((type, oldname) => "table_1").AsTable((type, oldname) => "table_2").AsTable((type, oldname) => "table_3").ToSql(a => a.Id); - select * from (SELECT a."Id" as1 FROM "table_1" a) ftb - UNION ALL select * from (SELECT a."Id" as1 FROM "table_2" a) ftb - UNION ALL select * from (SELECT a."Id" as1 FROM "table_3" a) ftb - 还可以这样:select.AsTable((a, b) => "(select * from tb_topic where clicks > 10)").Page(1, 10).ToList() - - - - - - - 设置别名规则,可用于拦截表别名,实现类似 sqlserver 的 with(nolock) 需求 - 如:select.AsAlias((_, old) => $"{old} with(lock)") - - - - - - - 动态Type,在使用 Select<object> 后使用本方法,指定实体类型 - - - - - - - 返回即将执行的SQL语句 - - 指定字段 - - - - - 执行SQL查询,是否有记录 - - - - - - 查询的记录数量 - - - - - - 查询的记录数量,以参数out形式返回 - - 返回的变量 - - - - - 指定从主库查询(默认查询从库) - - - - - - 左联查询,使用导航属性自动生成SQL - - 表达式 - - - - - 联接查询,使用导航属性自动生成SQL - - 表达式 - - - - - 右联查询,使用导航属性自动生成SQL - - 表达式 - - - - - 左联查询,指定关联的实体类型 - - 关联的实体类型 - 表达式 - - - - - 联接查询,指定关联的实体类型 - - 关联的实体类型 - 表达式 - - - - - 右联查询,指定关联的实体类型 - - 关联的实体类型 - 表达式 - - - - - 左联查询,使用原生sql语法,LeftJoin("type b on b.id = a.id and b.clicks > @clicks", new { clicks = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - sql语法条件 - 参数 - - - - - 联接查询,使用原生sql语法,InnerJoin("type b on b.id = a.id and b.clicks > @clicks", new { clicks = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - sql语法条件 - 参数 - - - - - 右联查询,使用原生sql语法,RightJoin("type b on b.id = a.id and b.clicks > @clicks", new { clicks = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - sql语法条件 - 参数 - - - - - 在 JOIN 位置插入 SQL 内容 - 如:.RawJoin("OUTER APPLY ( select id from t2 ) b") - - - - - - - 原生sql语法条件,Where("id = @id", new { id = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - sql语法条件 - 参数 - - - - - 原生sql语法条件,WhereIf(true, "id = @id", new { id = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - true 时生效 - sql语法条件 - 参数 - - - - - 动态过滤条件 - - - - - - - 禁用全局过滤功能,不传参数时将禁用所有 - - 零个或多个过滤器名字 - - - - - 排他更新锁 - 注意:务必在开启事务后使用该功能 - MySql: for update - SqlServer: With(UpdLock, RowLock, NoWait) - PostgreSQL: for update nowait - Oracle: for update nowait - Sqlite: 无效果 - 达梦: for update nowait - 人大金仓: for update nowait - 神通: for update - - noawait - - - - - 按原生sql语法分组,GroupBy("concat(name, @cc)", new { cc = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - sql语法 - 参数 - - - - - 按原生sql语法聚合条件过滤,Having("count(name) = @cc", new { cc = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - sql语法条件 - 参数 - - - - - 按原生sql语法排序,OrderBy("count(name) + @cc desc", new { cc = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - sql语法 - 参数 - - - - - 按原生sql语法排序,OrderBy(true, "count(name) + @cc desc", new { cc = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - true 时生效 - sql语法 - 参数 - - - - - 按属性名字符串排序(支持导航属性) - 属性名:Name导航属性:Parent.Name多表:b.Name - - 属性名:Name导航属性:Parent.Name多表:b.Name - 顺序 | 倒序 - - - - - 按属性名字符串排序(支持导航属性) - 属性名:Name导航属性:Parent.Name多表:b.Name - - true 时生效 - 属性名:Name导航属性:Parent.Name多表:b.Name - 顺序 | 倒序 - - - - - 查询向后偏移行数 - - - - - - - 查询向后偏移行数 - - 行数 - - - - - 查询多少条数据 - - - - - - - 查询多少条数据 - - - - - - - 分页 - - 第几页 - 每页多少 - - - - - 分页 - - 分页信息 - - - - - 查询数据前,去重 - - .Distinct().ToList(x => x.GroupName) 对指定字段去重 - - - .Distinct().ToList() 对整个查询去重 - - - - - - - 执行SQL查询,是否有记录 - - lambda表达式 - - - - - 将查询转换为 INSERT INTO tableName SELECT ... FROM t 执行插入 - - - 指定插入的表名,若为 null 则使用 TTargetEntity 实体表名 - 选择列 - 返回影响的行数 - - - - 执行SQL查询,返回 DataTable - - - - - - 执行SQL查询,返回指定字段的记录,记录不存在时返回 Count 为 0 的列表 - - 返回类型 - 选择列 - - - - - 执行SQL查询,返回 TDto 映射的字段,记录不存在时返回 Count 为 0 的列表 - - - - - - - 执行SQL查询,分块返回数据,可减少内存开销。比如读取10万条数据,每次返回100条处理。 - - 返回类型 - 选择列 - 数据块的大小 - 处理数据块 - - - - 执行SQL查询,返回指定字段的记录的第一条记录,记录不存在时返回 TReturn 默认值 - - 返回类型 - 选择列 - - - - - 执行SQL查询,返回 TDto 映射的字段,记录不存在时返回 Dto 默认值 - - - - - - - 执行SQL查询,返回指定字段的记录的第一条记录,记录不存在时返回 TReturn 默认值 - - 返回类型 - 选择列 - - - - - 执行SQL查询,返回 TDto 映射的字段,记录不存在时返回 Dto 默认值 - - - - - - - 返回即将执行的SQL语句 - - 返回类型 - 选择列 - 字段别名 - - - - - 执行SQL查询,返回指定字段的聚合结果 - - - - - - - - 执行SQL查询,返回指定字段的聚合结果给 output 参数 - fsql.Select<T>() - .Aggregate(a => new { count = a.Count, sum = a.Sum(a.Key.Price) }, out var agg) - .Page(1, 10).ToList(); - - - - - - - - - 求和 - - 返回类型 - 列 - - - - - 最小值 - - 返回类型 - 列 - - - - - 最大值 - - 返回类型 - 列 - - - - - 平均值 - - 返回类型 - 列 - - - - - 指定别名 - - 别名 - - - - - 多表查询 - - - - - - - - 查询条件,Where(a => a.Id > 10),支持导航对象查询,Where(a => a.Author.Email == "2881099@qq.com") - - lambda表达式 - - - - - 查询条件,Where(true, a => a.Id > 10),支导航对象查询,Where(true, a => a.Author.Email == "2881099@qq.com") - - true 时生效 - lambda表达式 - - - - - 多表条件查询 - - - lambda表达式 - - - - - 多表条件查询 - - - lambda表达式 - - - - - 多表条件查询 - - - - lambda表达式 - - - - - 多表条件查询 - - - - - lambda表达式 - - - - - 多表条件查询 - - - - - - lambda表达式 - - - - - 传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - 是否标识为NOT - - - - - 多表查询时,该方法标记后,表达式条件将对所有表进行附加 - - 例如:软删除、租户,每个表都给条件,挺麻烦的 - - fsql.Select<T1>().LeftJoin<T2>(...).Where<T2>((t1, t2 => t1.IsDeleted == false && t2.IsDeleted == false) - - 修改:fsql.Select<T1>().LeftJoin<T2>(...).WhereCascade(t1 => t1.IsDeleted == false) - - 当其中的实体可附加表达式才会进行,表越多时收益越大 - - - - - - - 按选择的列分组,GroupBy(a => a.Name) | GroupBy(a => new{a.Name,a.Time}) - - - - - - - 按列排序,OrderBy(a => a.Time) - - - - - - - - 按列排序,OrderBy(true, a => a.Time) - - - true 时生效 - - - - - - 按列排序,OrderByIf(true, a => a.Time) - - - true 时生效 - - true: DESC, false: ASC - - - - - 按列倒向排序,OrderByDescending(a => a.Time) - - 列 - - - - - 按列倒向排序,OrderByDescending(true, a => a.Time) - - true 时生效 - 列 - - - - - 贪婪加载导航属性,如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需此操作 - - - 选择一个导航属性 - - - - - 贪婪加载导航属性,如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需此操作 - - - true 时生效 - 选择一个导航属性 - - - - - 贪婪加载集合的导航属性,其实是分两次查询,ToList 后进行了数据重装 - 文档:https://github.com/dotnetcore/FreeSql/wiki/%E8%B4%AA%E5%A9%AA%E5%8A%A0%E8%BD%BD - - - 选择一个集合的导航属性,如: .IncludeMany(a => a.Tags) - 可以 .Where 设置临时的关系映射,如: .IncludeMany(a => a.Tags.Where(tag => tag.TypeId == a.Id)) - 可以 .Take(5) 每个子集合只取5条,如: .IncludeMany(a => a.Tags.Take(5)) - 可以 .Select 设置只查询部分字段,如: (a => new TNavigate { Title = a.Title }) - - 即能 ThenInclude,还可以二次过滤(这个 EFCore 做不到?) - - - - - 按属性名字符串进行 Include/IncludeMany 操作 - - - - - - - 按属性名字符串进行 Include/IncludeMany 操作 - - true 时生效 - - - - - - 实现 select .. from ( select ... from t ) a 这样的功能 - 使用 AsTable 方法也可以达到效果 - 示例:WithSql("select * from id=@id", new { id = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - SQL语句 - 参数 - - - - - 实现 select .. from ( select .. UNION ALL select .. ) a 这样的功能(基于内存数据) - - 内存数据 - - - - - 嵌套查询 select * from ( select ... from table ... ) a - - - - - - - - 查询条件,Where(a => a.Id > 10),支持导航对象查询,Where(a => a.Author.Email == "2881099@qq.com") - - lambda表达式 - - - - - 查询条件,Where(true, a => a.Id > 10),支导航对象查询,Where(true, a => a.Author.Email == "2881099@qq.com") - - true 时生效 - lambda表达式 - - - - - 按列排序,OrderBy(a => a.Time) - - - - - - - - 按列倒向排序,OrderByDescending(a => a.Time) - - 列 - - - - - 按聚合条件过滤,Having(a => a.Count() > 10) - - lambda表达式 - - - - - 按聚合条件过滤,HavingIf(true, a => a.Count() > 10) - - true 时生效 - lambda表达式 - - - - - 按列排序,OrderBy(a => a.Time) - - - - - - - - 按列倒向排序,OrderByDescending(a => a.Time) - - 列 - - - - - 执行SQL查询,返回指定字段的记录,记录不存在时返回 Count 为 0 的列表 - - 返回类型 - 选择列 - - - - - 执行SQL查询,返回指定字段的记录的第一条记录,记录不存在时返回 TReturn 默认值 - - - - - - - - 【linq to sql】专用方法,不建议直接使用 - - - - - 返回即将执行的SQL语句 - - 返回类型 - 选择列 - - - - - - 返回即将执行的SQL语句 - - 指定字段 - - - - - 嵌套查询 select * from ( select ... from table group by ... ) a - - - - - - - - 查询向后偏移行数 - - - - - - - 查询向后偏移行数 - - 行数 - - - - - 查询多少条数据 - - - - - - - 查询多少条数据 - - - - - - - 分页 - - 第几页 - 每页多少 - - - - - 分页 - - 分页信息 - - - - - 查询的记录数量 - - - - - - 查询的记录数量,以参数out形式返回 - - 返回的变量 - - - - - 分组的数据 - - - - - 记录总数 - - - - - - 求和 - - - - - - - - 平均值 - - - - - - - - 最大值 - - - - - - - - 最小值 - - - - - - - 所有元素 - - - - - 指定事务对象 - - - - - - - 指定事务对象 - - - - - - - 命令超时设置(秒) - - - - - - - 不使用参数化,可通过 IFreeSql.CodeFirst.IsNotCommandParameter 全局性设置 - - 是否不使用参数化 - - - - - 批量执行选项设置,一般不需要使用该方法 - 各数据库 rows, parameters 限制不一样,默认设置: - MySql 500 3000 - PostgreSQL 500 3000 - SqlServer 500 2100 - Oracle 200 999 - Sqlite 200 999 - 若没有事务传入,内部(默认)会自动开启新事务,保证拆包执行的完整性。 - - 指定根据 rows 上限数量拆分执行 - 指定根据 parameters 上限数量拆分执行 - 是否自动开启事务 - - - - - 批量执行时,分批次执行的进度状态 - - 批量执行时的回调委托 - - - - - 更新数据,设置更新的实体 - 注意:实体必须定义主键,并且最终会自动附加条件 where id = source.Id - - 实体 - - - - - 更新数据,设置更新的实体集合 - 注意:实体必须定义主键,并且最终会自动附加条件 where id in (source.Id) - - 实体集合 - 根据临时主键更新,a => a.Name | a => new{a.Name,a.Time} | a => new[]{"name","time"} - 忽略 IsVersion 乐观锁版本号 - - - - - 更新数据,设置更新的实体,同时设置忽略的列 - 忽略 null 属性:fsql.Update<T>().SetSourceAndIgnore(item, colval => colval == null) - 注意:参数 ignore 与 IUpdate.IgnoreColumns/UpdateColumns 不能同时使用 - - 实体 - 属性值忽略判断, true忽略 - - - - - 忽略的列,IgnoreColumns(a => a.Name) | IgnoreColumns(a => new{a.Name,a.Time}) | IgnoreColumns(a => new[]{"name","time"}) - 注意:不能与 UpdateColumns 不能同时使用 - - lambda选择列 - - - - - 忽略的列 - 注意:不能与 UpdateColumns 不能同时使用 - - 属性名,或者字段名 - - - - - 指定的列,UpdateColumns(a => a.Name) | UpdateColumns(a => new{a.Name,a.Time}) | UpdateColumns(a => new[]{"name","time"}) - 注意:不能与 IgnoreColumns 不能同时使用 - - lambda选择列 - - - - - 指定的列 - 注意:不能与 IgnoreColumns 同时使用 - - 属性名,或者字段名 - - - - - 设置列的新值,Set(a => a.Name, "newvalue") - - - lambda选择列 - 新值 - - - - - 设置列的新值,Set(a => a.Name, "newvalue") - - - true 时生效 - lambda选择列 - 新值 - - - - - 设置列的的新值为基础上增加,格式:Set(a => a.Clicks + 1) 相当于 clicks=clicks+1 - - 指定更新,格式:Set(a => new T { Clicks = a.Clicks + 1, Time = DateTime.Now }) 相当于 set clicks=clicks+1,time='2019-06-19....' - - - - - - - - 设置列的的新值为基础上增加,格式:Set(a => a.Clicks + 1) 相当于 clicks=clicks+1 - - 指定更新,格式:Set(a => new T { Clicks = a.Clicks + 1, Time = DateTime.Now }) 相当于 set clicks=clicks+1,time='2019-06-19....' - - - true 时生效 - - - - - - 设置值,自定义SQL语法,SetRaw("title = @title", new { title = "newtitle" }) - 提示:parms 参数还可以传 Dictionary<string, object> - - sql语法 - 参数 - - - - - 设置更新的列 - SetDto(new { title = "xxx", clicks = 2 }) - SetDto(new Dictionary<string, object> { ["title"] = "xxx", ["clicks"] = 2 }) - 注意:标记 [Column(CanUpdate = false)] 的属性不会被更新 - - dto 或 Dictionary<string, object> - - - - - lambda表达式条件,仅支持实体基础成员(不包含导航对象) - 若想使用导航对象,请使用 ISelect.ToUpdate() 方法 - - lambda表达式条件 - - - - - lambda表达式条件,仅支持实体基础成员(不包含导航对象) - 若想使用导航对象,请使用 ISelect.ToUpdate() 方法 - - true 时生效 - lambda表达式条件 - - - - - 原生sql语法条件,Where("id = @id", new { id = 1 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - sql语法条件 - 参数 - - - - - 传入实体,将主键作为条件 - - 实体 - - - - - 传入实体集合,将主键作为条件 - - 实体集合 - - - - - 传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - 是否标识为NOT - - - - - 禁用全局过滤功能,不传参数时将禁用所有 - - 零个或多个过滤器名字 - - - - - 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; - - - - - - - 设置表名 - - - - - - - 动态Type,在使用 Update<object> 后使用本方法,指定实体类型 - - - - - - - 返回即将执行的SQL语句 - - - - - - 执行SQL语句,返回影响的行数 - - - - - - 执行SQL语句,返回更新后的记录 - 注意:此方法只有 Postgresql/SqlServer 有效果 - - - - - - 主库连接池 - - - - - 从库连接池 - - - - - 数据库类型 - - - - - UseConnectionString 时候的值 - - - - - UseSalve 时候的值 - - - - - 唯一标识 - - - - - 开启事务(不支持异步) - - 事务体 () => {} - - - - 开启事务(不支持异步) - - - 事务体 () => {} - - - - 当前线程的事务 - - - - - 将 new { id = 1 } 或者 Dictionary<string, object> 转换为 DbParameter[] - - new { id = 1 } 或者 Dictionary<string, object> - - - - - SQL 命令执行类,fsql.Ado.CommandFluent("select * from user where age > @age", new { age = 25 }) - .WithConnection(connection) - .WithTransaction(transaction) - .WithParameter("age", 25) - .WithParameter("id", 11) - .CommandType(CommandType.Text) - .CommandTimeout(60) - .Query<T>(); 或者 ExecuteNonQuery/ExecuteScalar/ExecuteDataTable/ExecuteDataSet/ExecuteArray - - - - - - - - 测试数据库是否连接正确,本方法执行如下命令: - MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 - Oracle: SELECT 1 FROM dual - - 命令超时设置(秒) - true: 成功, false: 失败 - - - - 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 - - - - - - - - - 查询,ExecuteReader(dr => {}, "select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 查询 - - - - - - - - 查询,ExecuteArray("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 查询 - - - - - - - - 查询,ExecuteDataSet("select * from user where age > @age; select 2", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 查询 - - - - - - - - 查询,ExecuteDataTable("select * from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 在【主库】执行 - - - - - - - - 在【主库】执行,ExecuteNonQuery("delete from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 在【主库】执行 - - - - - - - - 在【主库】执行,ExecuteScalar("select 1 from user where age > @age", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - 执行SQL返回对象集合,Query<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) - - - - - - - - - - 执行SQL返回对象集合,Query<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>("select * from user where age > @age; select * from address", new { age = 25 }) - 提示:parms 参数还可以传 Dictionary<string, object> - - - - - - - - - - 测试数据库是否连接正确,本方法执行如下命令: - 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> - - - - - - - - - - - 可自定义解析表达式 - - - - - 自定义实体的配置,方便和多个 ORM 共同使用 - - - - - 自定义实体的属性配置,方便和多个 ORM 共同使用 - - - - - 增删查改,执行命令之前触发 - - - - - 增删查改,执行命令完成后触发 - - - - - CodeFirst迁移,执行之前触发 - - - - - CodeFirst迁移,执行完成触发 - - - - - Insert/Update自动值处理 - - - - - ADO.NET DataReader 拦截 - - - - - 监视数据库命令对象(执行前,调试) - - - - - 监视数据库命令对象(执行后,用于监视执行性能) - - - - - 跟踪开始 - - - - - 跟踪结束 - - - - - 内置解析功能,可辅助您进行解析 - - - - - 需要您解析的表达式 - - - - - 解析后的内容 - - - - - 实体类型 - - - - - 实体配置 - - - - - 索引配置 - - - - - 实体类型 - - - - - 实体的属性 - - - - - 实体的属性配置 - - - - - 标识符,可将 CurdBefore 与 CurdAfter 进行匹配 - - - - - 操作类型 - - - - - 实体类型 - - - - - 实体类型的元数据 - - - - - 执行的 SQL - - - - - 参数化命令 - - - - - 状态数据,可与 CurdAfter 共享 - - - - - 发生的错误 - - - - - 执行SQL命令,返回的结果 - - - - - 耗时(单位:Ticks) - - - - - 耗时(单位:毫秒) - - - - - 标识符,可将 SyncStructureBeforeEventArgs 与 SyncStructureAfterEventArgs 进行匹配 - - - - - 实体类型 - - - - - 状态数据,可与 SyncStructureAfter 共享 - - - - - 执行的 SQL - - - - - 发生的错误 - - - - - 耗时(单位:Ticks) - - - - - 耗时(单位:毫秒) - - - - - 类型 - - - - - 属性列的元数据 - - - - - 反射的属性信息 - - - - - 获取实体的属性值,也可以设置实体的属性新值 - - - - - 实体对象 - - - - - 中断实体对象审计 - false: 每个实体对象的属性都会审计(默认) - true: 每个实体对象只审计一次 - - - - - ADO.NET 数据流读取对象 - - - - - DataReader 对应的 Index 位置 - - - - - 获取 Index 对应的值,也可以设置拦截的新值 - - - - - 标识符,可将 CommandBefore 与 CommandAfter 进行匹配 - - - - - 状态数据,可与 CommandAfter 共享 - - - - - 发生的错误 - - - - - 执行SQL命令,返回的结果 - - - - - 耗时(单位:Ticks) - - - - - 耗时(单位:毫秒) - - - - - 标识符,可将 TraceBeforeEventArgs 与 TraceAfterEventArgs 进行匹配 - - - - - 状态数据,可与 TraceAfter 共享 - - - - - 备注 - - - - - 发生的错误 - - - - - 耗时(单位:Ticks) - - - - - 耗时(单位:毫秒) - - - - - 【开发环境必备】自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改 - - - - - 转小写同步结构,适用 PostgreSQL - - - - - 转大写同步结构,适用 Oracle/达梦/人大金仓 - - - - - 将数据库的主键、自增、索引设置导入,适用 DbFirst 模式,无须在实体类型上设置 [Column(IsPrimary)] 或者 ConfigEntity。此功能目前可用于 mysql/sqlserver/postgresql/oracle。 - 本功能会影响 IFreeSql 首次访问的速度。 - 若使用 CodeFirst 创建索引后,又直接在数据库上建了索引,若无本功能下一次 CodeFirst 迁移时数据库上创建的索引将被删除 - - - - - 不使用命令参数化执行,针对 Insert/Update - - - - - 是否生成命令参数化执行,针对 lambda 表达式解析 - 注意:常量不会参数化,变量才会做参数化 - var id = 100; - fsql.Select<T>().Where(a => a.id == id) 会参数化 - fsql.Select<T>().Where(a => a.id == 100) 不会参数化 - - - - - 延时加载导航属性对象,导航属性需要声明 virtual - - - - - 将实体类型与数据库对比,返回DDL语句 - - - - - - - 将实体类型集合与数据库对比,返回DDL语句 - - 实体类型 - - - - - 将实体类型与数据库对比,返回DDL语句(指定表名) - - 实体类型 - 指定表名对比 - - - - - 同步实体类型到数据库 - 注意:生产环境中谨慎使用 - - - - - - 同步实体类型集合到数据库 - 注意:生产环境中谨慎使用 - - - - - - 同步实体类型到数据库(指定表名) - 注意:生产环境中谨慎使用 - - 实体类型 - 指定表名对比 - 强制同步结构,无视缓存每次都同步 - - - - 根据 System.Type 获取数据库信息 - - - - - - - FreeSql FluentApi 配置实体,方法名与特性相同 - - - - - - - - FreeSql FluentApi 配置实体,方法名与特性相同 - - - - - - - - 获取 FreeSql FluentApi 配置实体的元数据 - - - 未使用ConfigEntity配置时,返回null - - - - 获取实体类核心配置 - - - - - - - 获取所有数据库 - - - - - - 获取指定数据库的表信息,包括表、列详情、主键、唯一键、索引、外键、备注 - - - - - - - 获取指定单表信息,包括列详情、主键、唯一键、索引、备注 - - 表名,如:dbo.table1 - 是否忽略大小写 - - - - - 判断表是否存在 - - 表名,如:dbo.table1 - 是否忽略大小写 - - - - - 获取数据库枚举类型int值 - - - - - - - 获取c#转换,(int)、(long) - - - - - - - 获取c#值 - - - - - - - 获取c#类型,int、long - - - - - - - 获取c#类型对象 - - - - - - - 获取ado.net读取方法, GetBoolean、GetInt64 - - - - - - - 序列化 - - - - - - - 反序列化 - - - - - - - 获取数据库枚举类型,适用 PostgreSQL - - - - - - - 临时 LambdaExpression.Parameter - - - - - 如果实体类有自增属性,分成两个 List,有值的Item1 merge,无值的Item2 insert - - - - - - - AsType, Ctor, ClearData 三处地方需要重新加载 - - - - - AsType, Ctor, ClearData 三处地方需要重新加载 - - - - - 动态读取 DescriptionAttribute 注释文本 - - - - - - - 通过属性的注释文本,通过 xml 读取 - - - Dict:key=属性名,value=注释 - - - - 更新实体的元数据 - - - - - 执行更新的 SQL - - - - - 执行更新命令的参数 - - - - - 执行更新命令影响的行 - - - - - 更新的实体数量 - - - - - 更新的实体 - - - - - 映射优先级,默认: Attribute > FluentApi > Aop - - - - - 实体特性 - [Table(Name = "tabname")] - [Column(Name = "table_id")] - - - - - 流式接口 - fsql.CodeFirst.ConfigEntity(a => a.Name("tabname")) - fsql.CodeFirst.ConfigEntity(a => a.Property(b => b.Id).Name("table_id")) - - - - - AOP 特性 https://github.com/dotnetcore/FreeSql/wiki/AOP - fsql.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = "public.tabname"; - fsql.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = "table_id"; - - - - - 不进行任何处理 - - - - - 将帕斯卡命名字符串转换为下划线分隔字符串 - - BigApple -> Big_Apple - - - - - 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全大写 - - BigApple -> BIG_APPLE - - - - - 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全小写 - - BigApple -> big_apple - - - - - 将字符串转换为大写 - - BigApple -> BIGAPPLE - - - - - 将字符串转换为小写 - - BigApple -> bigapple - - - - - 创建一个过滤器 - 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal - - - 名字 - 表达式 - - - - - 创建一个动态过滤器,当 condition 返回值为 true 时才生效 - 场景:当登陆身份是管理员,则过滤条件不生效 - 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal - - - 名字 - 委托,返回值为 true 时才生效 - 表达式 - - - - - 创建一个过滤器(实体类型 属于指定 TEntity 才会生效) - 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal - - - 名字 - 表达式 - - - - - 创建一个过滤器(实体类型 属于指定 TEntity 才会生效) - 场景:当登陆身份是管理员,则过滤条件不生效 - 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal - - - 名字 - 委托,返回值为 true 时才生效 - 表达式 - - - - - 使用指定 DbConnection 连接执行 - - - - - - - 使用指定 DbTransaction 事务执行 - - - - - - - 增加参数化对象 - - 参数名 - 参数值 - 修改本次创建好的参数化对象,比如将 parameterName 参数修改为 Output 类型 - - - - - 设置执行的命令类型,SQL文本、或存储过程 - - - - - - - 设置命令执行超时(秒) - - - - - - - 分页信息 - - - - - 第几页,从1开始 - - - - - 每页多少 - - - - - 查询的记录数量 - - - - - 当前操作的数据 - - - - - 当前批次 - - - - - 总批次数量 - - - - - 获取 obj.CsName 属性值 MapType 之后的数据库值 - - - - - - - 获取 obj.CsName 属性原始值(不经过 MapType) - - - - - - 设置 obj.CsName 属性值 - - - - - - - 动态过滤条件 - - - - - 属性名:Name - 导航属性:Parent.Name - 多表:b.Name - - - - - 操作符 - - - - - 值 - - - - - Filters 下的逻辑运算符 - - - - - 子过滤条件,它与当前的逻辑关系是 And - 注意:当前 Field 可以留空 - - - - - like - - - - - = - Equal/Equals/Eq 效果相同 - - - - - = - Equal/Equals/Eq 效果相同 - - - - - = - Equal/Equals/Eq 效果相同 - - - - - <> - - - - - > - - - - - >= - - - - - < - - - - - <= - - - - - >= and < - 此时 Value 的值格式为逗号分割:value1,value2 或者数组 - - - - - >= and < - 此时 Value 的值格式为逗号分割:date1,date2 或者数组 - 这是专门为日期范围查询定制的操作符,它会处理 date2 + 1,比如: - 当 date2 选择的是 2020-05-30,那查询的时候是 < 2020-05-31 - 当 date2 选择的是 2020-05,那查询的时候是 < 2020-06 - 当 date2 选择的是 2020,那查询的时候是 < 2021 - 当 date2 选择的是 2020-05-30 12,那查询的时候是 < 2020-05-30 13 - 当 date2 选择的是 2020-05-30 12:30,那查询的时候是 < 2020-05-30 12:31 - 并且 date2 只支持以上 5 种格式 (date1 没有限制) - - - - - in (1,2,3) - 此时 Value 的值格式为逗号分割:value1,value2,value3... 或者数组 - - - - - not in (1,2,3) - 此时 Value 的值格式为逗号分割:value1,value2,value3... 或者数组 - - - - - 自定义解析,此时 Field 为反射信息,Value 为静态方法的参数(string/Expression) - 示范:{ Operator: "Custom", Field: "RawSql webapp1.DynamicFilterCustom,webapp1", Value: "(id,name) in ((1,'k'),(2,'m'))" } - 注意:使用者自己承担【注入风险】 - 静态方法定义示范: - namespace webapp1 - { - public class DynamicFilterCustom - { - [DynamicFilterCustom] - public static string RawSql(object sender, string value) => value; - } - } - - - - - 授权 DynamicFilter 支持 Custom 自定义解析 - - - - - 是否放弃继续读取 - - - - - 中间表,多对多 - - - - - PostgreSQL 数组类型专属功能 - 方式一:select * from Role where Id in (RoleIds) - class User { - ____public int[] RoleIds { get; set; } - ____[Navigate(nameof(RoleIds))] - ____public List<Role> Roles { get; set; } - } - 方式二:select * from User where RoleIds @> Id - class Role { - ____public int Id { get; set; } - ____[Navigate(nameof(User.RoleIds))] - ____public List<User> Users { get; set; } - } - - - - - 是否可用 - - - - - 不可用错误 - - - - - 不可用时间 - - - - - 将对象池设置为不可用,后续 Get/GetAsync 均会报错,同时启动后台定时检查服务恢复可用 - - - - 由【可用】变成【不可用】时返回true,否则返回false - - - - 统计对象池中的对象 - - - - - 统计对象池中的对象(完整) - - - - - 获取资源 - - 超时 - - - - - 获取资源 - - - - - - 使用完毕后,归还资源 - - 对象 - 是否重新创建 - - - - 名称 - - - - - 池容量 - - - - - 默认获取超时设置 - - - - - 空闲时间,获取时若超出,则重新创建 - - - - - 异步获取排队队列大小,小于等于0不生效 - - - - - 获取超时后,是否抛出异常 - - - - - 监听 AppDomain.CurrentDomain.ProcessExit/Console.CancelKeyPress 事件自动释放 - - - - - 后台定时检查可用性间隔秒数 - - - - - 权重 - - - - - 对象池的对象被创建时 - - 返回被创建的对象 - - - - 销毁对象 - - 资源对象 - - - - 从对象池获取对象超时的时候触发,通过该方法统计 - - - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - - - - 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 - - 资源对象 - - - - 归还对象给对象池的时候触发 - - 资源对象 - - - - 检查可用性 - - 资源对象 - - - - - 事件:可用时触发 - - - - - 事件:不可用时触发 - - - - - 所属对象池 - - - - - 在对象池中的唯一标识 - - - - - 资源对象 - - - - - 被获取的总次数 - - - - 最后获取时的时间 - - - - 最后归还时的时间 - - - - - 创建时间 - - - - - 最后获取时的线程id - - - - - 最后归还时的线程id - - - - - 重置 Value 值 - - - - - 对象池管理类 - - 对象类型 - - - - 后台定时检查可用性 - - - - - - 创建对象池 - - 池大小 - 池内对象的创建委托 - 获取池内对象成功后,进行使用前操作 - - - - 创建对象池 - - 策略 - - - - 获取可用资源,或创建资源 - - - - - - - String resources used in FreeSql exceptions, etc. - - - These strings are exposed publicly for use by database providers and extensions. - It is unusual for application code to need these strings. - - - - - - 重写当前线程的 CurrentUICulture 属性,对 - 使用此强类型资源类的所有资源查找执行重写。 - - - - - [Table(AsTable = "{asTable}")] 特性值格式错误 - - - - - [Table(AsTable = xx)] 设置的属性名 {atmGroupsValue} 不是 DateTime 类型 - - - - - {name}: Failed to get resource {statistics} - - - - - {name}: An exception needs to be thrown - - - - - 错误的表达式格式 {column} - - - - - Chunk 功能之前不可使用 Select - - - - - 安全起见,请务必在事务开启之后,再使用 ForUpdate - - - - - 不能为 null - - - - - {name} 不能为 null - - - - - 无法匹配 {property} - - - - - {property} 无法解析为表达式树 - - - - - 参数 masterConnectionString 不可为空,请检查 UseConnectionString - - - - - 提交 - - - - - 连接失败,准备切换其他可用服务器 - - - - - 自定义表达式解析错误:类型 {exp3MethodDeclaringType} 需要定义 static ThreadLocal<ExpressionCallContext> 字段、字段、字段(重要三次提醒) - - - - - Custom { 反射信息 }不能为空,格式:{ 静态方法名 }{ 空格 }{ 反射信息 } - - - - - Custom { 静态方法名 }不能为空,格式:{ 静态方法名 }{ 空格 }{ 反射信息 } - - - - - Custom 对应的{{ 静态方法名 }}:{fiValueCustomArray} 未设置 [DynamicFilterCustomAttribute] 特性 - - - - - Custom 要求 Field 应该空格分割,并且长度为 2,格式:{ 静态方法名 }{ 空格 }{ 反射信息 } - - - - - 操作的数据类型({dataDisplayCsharp}) 与 AsType({tableTypeDisplayCsharp}) 不一致,请检查。 - - - - - DateRange 要求 Value 应该逗号分割,并且长度为 2 - - - - - DateRange 要求 Value[1] 格式必须为:yyyy、yyyy-MM、yyyy-MM-dd、yyyy-MM-dd HH、yyyy、yyyy-MM-dd HH:mm - - - - - 记录可能不存在,或者【行级乐观锁】版本过旧,更新数量{sourceCount},影响的行数{affrows}。 - - - - - SlaveConnectionString 数量与 SlaveWeights 不相同 - - - - - ColumnAttribute.Name {colattrName} 重复存在,请检查(注意:不区分大小写) - - - - - 属性名 {pName} 重复存在,请检查(注意:不区分大小写) - - - - - {function} 功能要求实体类 {tableCsName} 必须有主键 - - - - - {tbTypeFullName} 是父子关系,但是 MySql 8.0 以下版本中不支持组合多主键 - - - - - {tbTypeFullName} 不是父子关系,无法使用该功能 - - - - - 这个特别的子查询不能解析 - - - - - 表达式错误,它的顶级对象不是 ParameterExpression:{exp} - - - - - 表达式错误,它不是连续的 MemberAccess 类型:{exp} - - - - - ExpressionTree 转换类型错误,值({value}),类型({valueTypeFullName}),目标类型({typeFullName}),{exMessage} - - - - - 未能解析分表字段值 {sqlWhere} - - - - - AsTable 未实现的功能 {asTable} - - - - - GBase 暂时不支持逗号以外的分割符 - - - - - tableName:{tableName} 生成了相同的分表名 - - - - - GetPrimarys 传递的参数 "{primary}" 不正确,它不属于字典数据的键名 - - - - - 已经指定了 {first},不能再指定 {second} - - - - - {tb2DbName}.{mp2MemberName} 被忽略,请检查 IsIgnore 设置,确认 get/set 为 public - - - - - Include 参数类型错误 - - - - - Include 参数类型错误,集合属性请使用 IncludeMany - - - - - Include 参数类型错误,表达式类型应该为 MemberAccess - - - - - IncludeMany 类型 {tbTypeDisplayCsharp} 的属性 {collMemMemberName} 不是有效的导航属性,提示:IsIgnore = true 不会成为导航属性 - - - - - IncludeMany {navigateSelector} 参数错误,Select 只可以使用一个参数的方法,正确格式:.Select(t =>new TNavigate {{}}) - - - - - IncludeMany {navigateSelector} 参数错误,Select lambda参数返回值必须和 {collMemElementType} 类型一致 - - - - - IncludeMany 参数1 类型错误,表达式类型应该为 MemberAccess - - - - - IncludeMany {navigateSelector} 参数类型错误,正确格式: a.collections.Take(1).Where(c =>c.aid == a.id).Select(a=> new TNavigate{{}}) - - - - - ISelect.InsertInto() 未选择属性: {displayCsharp} - - - - - ISelect.InsertInto() 类型错误: {displayCsharp} - - - - - InsertOrUpdate 功能执行 merge into 要求实体类 {CsName} 必须有主键 - - - - - InsertOrUpdate<>的泛型参数 不支持 {typeofT1},请传递您的实体类 - - - - - 【延时加载】功能需要安装 FreeSql.Extensions.LazyLoading.dll,可前往 nuget 下载 - - - - - 【延时加载】{trytbTypeName} 编译错误:{exMessage}\r\n\r\n{cscode} - - - - - 【延时加载】实体类型 {trytbTypeName} 必须声明为 public - - - - - ManyToMany 导航属性 .AsSelect() 暂时不可用于 Sum/Avg/Max/Min/First/ToOne/ToList 方法 - - - - - 【ManyToMany】导航属性 {trytbTypeName}.{pnvName} 在 {tbmidCsName} 中没有找到对应的字段,如:{midTypePropsTrytbName}{findtrytbPkCsName}、{midTypePropsTrytbName}_{findtrytbPkCsName} - - - - - 【ManyToMany】导航属性 {trytbTypeName}.{pnvName} 解析错误,实体类型 {tbrefTypeName} 缺少主键标识,[Column(IsPrimary = true)] - - - - - 【ManyToMany】导航属性 {trytbTypeName}.{pnvName} 解析错误,实体类型 {tbrefTypeName} 必须存在对应的 [Navigate(ManyToMany = x)] 集合属性 - - - - - 【ManyToMany】导航属性 {trytbTypeName}.{pnvName} 解析错误,{tbmidCsName}.{trycolCsName} 和 {trytbCsName}.{trytbPrimarysCsName} 类型不一致 - - - - - 【ManyToMany】导航属性 {trytbTypeName}.{pnvName} 解析错误,中间类 {tbmidCsName}.{midTypePropsTrytbName} 错误:{exMessage} - - - - - 【ManyToMany】导航属性 {trytbTypeName}.{pnvName} 解析错误,中间类 {tbmidCsName}.{midTypePropsTrytbName} 导航属性不是【ManyToOne】或【OneToOne】 - - - - - 映射异常:{name} 没有一个属性名相同 - - - - - Ado.MasterPool 值为 null,该操作无法自启用事务,请显式传递【事务对象】解决 - - - - - 缺少 FreeSql 数据库实现包:FreeSql.Provider.{Provider}.dll,可前往 nuget 下载 - - - - - 缺少 FreeSql 数据库实现包:{dll},可前往 nuget 下载;如果存在 {dll} 依然报错(原因是环境问题导致反射不到类型),请在 UseConnectionString/UseConnectionFactory 第三个参数手工传入 typeof({providerType}) - - - - - 导航属性 {trytbTypeName}.{pnvName} 特性 [Navigate] Bind 数目({bindColumnsCount}) 与 外部主键数目({tbrefPrimarysLength}) 不相同 - - - - - {tb2DbName}.{mp2MemberName} 导航属性集合忘了 .AsSelect() 吗?如果在 ToList(a => a.{mp2MemberName}) 中使用,请移步参考 IncludeMany 文档。 - - - - - 【导航属性】{trytbTypeDisplayCsharp}.{pName} 缺少 set 属性 - - - - - 导航属性 {trytbTypeName}.{pnvName} 没有找到对应的字段,如:{pnvName}{findtbrefPkCsName}、{pnvName}_{findtbrefPkCsName}。或者使用 [Navigate] 特性指定关系映射。 - - - - - 导航属性 {trytbTypeName}.{pnvName} 解析错误,实体类型 {trytcTypeName} 缺少主键标识,[Column(IsPrimary = true)] - - - - - 导航属性 {trytbTypeName}.{pnvName} 解析错误,{trytbCsName}.{trycolCsName} 和 {tbrefCsName}.{tbrefPrimarysCsName} 类型不一致 - - - - - 导航属性 {trytbTypeName}.{pnvName} 特性 [Navigate] 解析错误,在 {tbrefTypeName} 未找到属性:{bi} - - - - - {tableTypeDisplayCsharp} 没有定义主键,无法使用 SetSource,请尝试 SetDto 或者 SetSource 指定临时主键 - - - - - 没有定义属性 - - - - - 未实现 - - - - - 未实现函数表达式 {exp} 解析 - - - - - 未实现函数表达式 {exp} 解析,参数 {expArguments} 必须为常量 - - - - - 未实现函数表达式 {exp} 解析,如果正在操作导航属性集合,请使用 .AsSelect().{exp3MethodName}({exp3ArgumentsCount}) - - - - - 未实现 MemberAccess 下的 Constant - - - - - 未实现 {name} - - - - - 不支持 - - - - - {dataType} 不支持 OrderByRandom 随机排序 - - - - - {property} 不是有效的导航属性 - - - - - {dbName} 找不到列 {memberName} - - - - - 找不到 {CsName} 对应的列 - - - - - 找不到属性:{memberName} - - - - - 找不到属性名 {proto} - - - - - Custom 找不到对应的{{ 反射信息 }}:{fiValueCustomArray} - - - - - Custom 找不到对应的{{ 静态方法名 }}:{fiValueCustomArray} - - - - - [Table(AsTable = xx)] 设置的属性名 {atmGroupsValue} 不存在 - - - - - 未指定 UseConnectionString 或者 UseConnectionFactory - - - - - 【{policyName}】ObjectPool.{GetName}() timeout {totalSeconds} seconds, see: https://github.com/dotnetcore/FreeSql/discussions/1081 - - - - - 【{policyName}】ObjectPool.GetAsync() The queue is too long. Policy.AsyncGetCapacity = {asyncGetCapacity} - - - - - 【OneToMany】导航属性 {trytbTypeName}.{pnvName} 在 {tbrefCsName} 中没有找到对应的字段,如:{findtrytb}{findtrytbPkCsName}、{findtrytb}_{findtrytbPkCsName} - - - - - 【OneToMany】导航属性 {trytbTypeName}.{pnvName} 解析错误,{trytbCsName}.{trytbPrimarysCsName} 和 {tbrefCsName}.{trycolCsName} 类型不一致 - - - - - 、{refpropName}{findtrytbPkCsName}、{refpropName}_{findtrytbPkCsName}。或者使用 [Navigate] 特性指定关系映射。 - - - - - 参数 field 未指定 - - - - - {property} 参数错误,它不是集合属性,必须为 IList<T> 或者 ICollection<T> - - - - - {property} 参数错误,它不是有效的导航属性 - - - - - {where} 参数错误,{keyval} 不是有效的属性名,在实体类 {reftbTypeDisplayCsharp} 无法找到 - - - - - {property} 参数错误,格式 "TopicId=Id,多组使用逗号连接" - - - - - 解析失败 {callExpMethodName} {message} - - - - - 【{policyName}】The ObjectPool has been disposed, see: https://github.com/dotnetcore/FreeSql/discussions/1079 - - - - - 【{policyName}】状态不可用,等待后台检查程序恢复方可使用。{UnavailableExceptionMessage} - - - - - 属性{trytbVersionColumnCsName} 被标注为行锁(乐观锁)(IsVersion),但其必须为数字类型 或者 byte[] 或者 string,并且不可为 Nullable - - - - - properties 参数不能为空 - - - - - {property} 属性名无法找到 - - - - - Range 要求 Value 应该逗号分割,并且长度为 2 - - - - - 回滚 - - - - - 运行时错误,反射获取 IncludeMany 方法失败 - - - - - 蛋疼的 Access 插入只能一条一条执行,不支持 values(..),(..) 也不支持 select .. UNION ALL select .. - - - - - BaseEntity.Initialization 初始化错误,获取到 IFreeSql 是 null - - - - - 【{thisName}】Block access and wait for recovery: {exMessage} - - - - - 无法将 IQueryable<{typeofName}> 转换为 ISelect<{typeofName}>,因为他的实现不是 FreeSql.Extensions.Linq.QueryableProvider - - - - - 连接字符串错误 - - - - - 【{thisName}】连接字符串错误,请检查。 - - - - - 连接字符串错误,或者检查项目属性 > 生成 > 目标平台:x86 | x64,或者改用 FreeSql.Provider.SqliteCore 访问 arm 平台 - - - - - 【{thisName}】连接字符串错误,请检查。或者检查项目属性 > 生成 > 目标平台:x86 | x64,或者改用 FreeSql.Provider.SqliteCore 访问 arm 平台 - - - - - FreeSql.Provider.CustomAdapter 无法使用 CreateCommand - - - - - FreeSql.Provider.CustomAdapter 仅支持 UseConnectionFactory 方式构建 IFreeSql - - - - - 达梦 CodeFirst 不支持代码创建 tablespace 与 schemas {tbname} - - - - - -DB 参数错误,未提供 ConnectionString - - - - - -DB 参数错误,格式为:MySql,ConnectionString - - - - - -DB 参数错误,不支持的类型:"{dbargs}" - - - - - {method} 是 FreeSql.Provider.{provider} 特有的功能 - - - - - fsql.InsertOrUpdate Sqlite 无法完成 UpdateColumns 操作 - - - - - 主库 - - - - - MygisGeometry.Parse 未实现 "{wkt}" - - - - - -NameOptions 参数错误,格式为:0,0,0,0 - - - - - 未实现该功能 - - - - - 未实现错误,请反馈给作者 - - - - - 找不到 {name} - - - - - FreeSql.Provider.{providerName} 未实现 Skip/Offset 功能,如果需要分页请使用判断上一次 id - - - - - 对象池 - - - - - 旧表(OldName):{tboldname} 存在,数据库已存在 {tbname} 表,无法改名 - - - - - OnConflictDoUpdate 功能要求实体类必须设置 IsPrimary 属性 - - - - - Oracle CodeFirst 不支持代码创建 tablespace 与 schemas {tbname} - - - - - 解析失败 {callExpMethodName} {message},提示:可以使用扩展方法 IQueryable.RestoreToSelect() 还原为 ISelect 再查询 - - - - - fsql.InsertOrUpdate + IfExistsDoNothing + {providerName}要求实体类 {tableCsName} 必须有主键 - - - - - SelectMany 错误的类型:{typeFullName} - - - - - 从库 - - - - - 类型 {objentityTypeFullName} 不可迁移 - - - - - 类型 {objentityTypeFullName} 不可迁移,可迁移属性0个 - - - - - 未实现 {columnDbTypeTextFull} 类型映射 - - - - - 错误的参数设置:{args} - - - - - {qoteSql} is NULL,除非设置特性 [Column(IsNullable = false)] - - - - - 分表字段值 "{dt}" 不能小于 "{beginTime} " - - - - - 分表字段值不能为 null - - - - - 分表字段值 "{columnValue}" 不能转化成 DateTime - - - - - 分表字段值 "{dt}" 未匹配到分表名 - - - - - T2 类型错误 - - - - - tableName 格式错误,示例:“log_{yyyyMMdd}” - - - - - {Type}.AsType 参数错误,请传入正确的实体类型 - - - - - {thatFullName} 类型无法访问构造函数 - - - - - {name} 类型错误 - - - - - {Type}.AsType 参数不支持指定为 object - - - - - 类型 {typeofFullName} 错误,不能使用 IncludeMany - - - - - 无法解析表达式:{exp} - - - - - 无法解析表达式方法 {exp3tmpCallMethodName} - - - - - 请使用 fsql.InsertDict(dict) 方法插入字典数据 - - - - - C#: that >= between && that <= and - SQL: that BETWEEN between AND and - - - - - - - - - 注意:这个方法和 Between 有细微区别 - C#: that >= start && that < end - SQL: that >= start and that < end - - - - - - - - - 获取 Type 的原始 c# 文本表示 - - - - - - - - 测量两个经纬度的距离,返回单位:米 - - 经纬坐标1 - 经纬坐标2 - 返回距离(单位:米) - - - - 将 IEnumable<T> 转成 ISelect<T>,以便使用 FreeSql 的查询功能。此方法用于 Lambda 表达式中,快速进行集合导航的查询。 - - - - - - - - 多表查询 - - - - - - 本方法实现从已知的内存 List 数据,进行和 ISelect.IncludeMany 相同功能的贪婪加载 - 示例:new List<Song>(new[] { song1, song2, song3 }).IncludeMany(fsql, a => a.Tags); - 文档:https://github.com/dotnetcore/FreeSql/wiki/%E8%B4%AA%E5%A9%AA%E5%8A%A0%E8%BD%BD - - - - - - 选择一个集合的导航属性,如: .IncludeMany(a => a.Tags) - 可以 .Where 设置临时的关系映射,如: .IncludeMany(a => a.Tags.Where(tag => tag.TypeId == a.Id)) - 可以 .Take(5) 每个子集合只取5条,如: .IncludeMany(a => a.Tags.Take(5)) - 可以 .Select 设置只查询部分字段,如: (a => new TNavigate { Title = a.Title }) - - 即能 ThenInclude,还可以二次过滤(这个 EFCore 做不到?) - - - - - 本方法实现从已知的内存 List 数据,进行和 ISelect.IncludeMany/Include 相同功能的贪婪加载 - 集合:new List<Song>(new[] { song1, song2, song3 }).IncludeByPropertyName(fsql, "Tags", "ParentId=Id", 5, "Id,Name"); - 普通:new List<Song>(new[] { song1, song2, song3 }).IncludeByPropertyName(fsql, "Catetory"); - ---普通属性 where/take/select 参数将无效 - 文档:https://github.com/dotnetcore/FreeSql/wiki/%E8%B4%AA%E5%A9%AA%E5%8A%A0%E8%BD%BD - - - - - 选择一个集合或普通属性 - 设置临时的子集合关系映射,格式:子类属性=T1属性,多组以逗号分割 - 设置子集合只取条数 - 设置子集合只查询部分字段 - - - - - - 查询数据,加工为树型 List 返回 - 注意:实体需要配置父子导航属性 - - - - - - - - 使用递归 CTE 查询树型的所有子记录,或者所有父记录。 - 通过测试的数据库:MySql8.0、SqlServer、PostgreSQL、Oracle、Sqlite、Firebird、达梦、人大金仓、翰高 - 返回隐藏字段:.ToList(a => new { item = a, level = "a.cte_level", path = "a.cte_path" }) - * v2.0.0 兼容 MySql5.6 向上或向下查询,但不支持 pathSelector/pathSeparator 详细:https://github.com/dotnetcore/FreeSql/issues/536 - - - - false(默认):由父级向子级的递归查询true:由子级向父级的递归查询 - 路径内容选择 - 连接路径内容 - 递归层级 - - - - - 随机排序 - 支持:MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/金仓/神通 - 不支持:MsAcess - - - - - - 插入数据字典 Dictionary<string, object> - - - - - - - 插入数据字典,传入 Dictionary<string, object> 集合 - - - - - - - 更新数据字典 Dictionary<string, object> - - - - - - - 更新数据字典,传入 Dictionary<string, object> 集合 - - - - - - - 插入或更新数据字典,此功能依赖数据库特性(低版本可能不支持),参考如下: - 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:不支持 - - - - - - - 删除数据字典 Dictionary<string, object> - - - - - - - 删除数据字典,传入 Dictionary<string, object> 集合 - - - - - - - 使用 and 拼接两个 lambda 表达式 - - - - - - 使用 and 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 将 lambda 表达式取反 - - - true 时生效 - - - - - 使用 and 拼接两个 lambda 表达式 - - - - - - 使用 and 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 将 lambda 表达式取反 - - - true 时生效 - - - - - 使用 and 拼接两个 lambda 表达式 - - - - - - 使用 and 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 将 lambda 表达式取反 - - - true 时生效 - - - - - 使用 and 拼接两个 lambda 表达式 - - - - - - 使用 and 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - - - - 使用 or 拼接两个 lambda 表达式 - - - true 时生效 - - - - - - 将 lambda 表达式取反 - - - true 时生效 - - - - - 使用 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 条件 - - - - + + + + FreeSql + + + + + 数据库列名 + + + + + 指定数据库旧的列名,修改实体属性命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库字段;否则将视为【新增字段】 + + + + + 数据库类型,如: varchar(255) + 字符串长度,可使用特性 [MaxLength(255)] + + + + + 主键 + + + + + 自增标识 + + + + + 是否可DBNull + + + + + 忽略此列,不迁移、不插入 + + + + + 设置行锁(乐观锁)版本号,每次更新累加版本号,若更新整个实体时会附带当前的版本号判断(修改失败时抛出异常) + + + + + 类型映射,除了可做基本的类型映射外,特别介绍的功能: + 1、将 enum 属性映射成 typeof(string) + 2、将 对象 属性映射成 typeof(string),请安装扩展包 FreeSql.Extensions.JsonMap + + + + + 创建表时字段的位置(场景:实体继承后设置字段顺序),规则如下: + + >0时排前面,1,2,3... + + =0时排中间(默认) + + <0时排后面,...-3,-2,-1 + + + + + 该字段是否可以插入,默认值true,指定为false插入时该字段会被忽略 + + + + + 该字段是否可以更新,默认值true,指定为false更新时该字段会被忽略 + + + + + 标记属性为数据库服务器时间(utc/local),在插入的时候使用类似 getdate() 执行 + + + + + 设置长度,针对 string/byte[] 类型避免 DbType 的繁琐设置 + 提示:也可以使用 [MaxLength(100)] + --- + StringLength = 100 时,对应 DbType: + MySql -> varchar(100) + SqlServer -> nvarchar(100) + PostgreSQL -> varchar(100) + Oracle -> nvarchar2(100) + Sqlite -> nvarchar(100) + --- + StringLength < 0 时,对应 DbType: + MySql -> text (StringLength = -2 时,对应 longtext) + SqlServer -> nvarchar(max) + PostgreSQL -> text + Oracle -> nclob + Sqlite -> text + v1.6.0+ byte[] 支持设置 StringLength + + + + + 执行 Insert 方法时使用此值 + 注意:如果是 getdate() 这种请可考虑使用 ServerTime,因为它对数据库间作了适配 + + + + + decimal/numeric 类型的长度 + + + + + decimal/numeric 类型的小数位长度 + + + + + 重写功能 + 比如:[Column(RewriteSql = "geography::STGeomFromText({0},4236)")] + 插入:INSERT INTO [table]([geo]) VALUES(geography::STGeomFromText('...',4236)) + 提示:更新也生效 + + + + + 重读功能 + 比如:[Column(RereadSql = "{0}.STAsText()")] + 查询:SELECT a.[id], a.[geo].STAsText() FROM [table] a + + + + + 数据库列名 + + + + + 指定数据库旧的列名,修改实体属性命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库字段;否则将视为【新增字段】 + + + + + 数据库类型,如: varchar(255) + + + + + 主键 + + + + + 自增标识 + + + + + 是否可DBNull + + + + + 忽略此列,不迁移、不插入 + + + + + 乐观锁 + + + + + 类型映射,比如:可将 enum 属性映射成 typeof(string) + + + + + + + 创建表时字段位置,规则如下: + + >0时排前面 + + =0时排中间(默认) + + <0时排后面 + + + + + + + 该字段是否可以插入,默认值true,指定为false插入时该字段会被忽略 + + + + + + + 该字段是否可以更新,默认值true,指定为false更新时该字段会被忽略 + + + + + + + 标记属性为数据库服务器时间(utc/local),在插入的时候使用类似 getdate() 执行 + + + + + + + 设置长度,针对 string 类型避免 DbType 的繁琐设置 + --- + StringLength = 100 时,对应 DbType: + MySql -> varchar(100) + SqlServer -> nvarchar(100) + PostgreSQL -> varchar(100) + Oracle -> nvarchar2(100) + Sqlite -> nvarchar(100) + --- + StringLength = -1 时,对应 DbType: + MySql -> text + SqlServer -> nvarchar(max) + PostgreSQL -> text + Oracle -> nvarchar2(4000) + Sqlite -> text + + + + + 执行 Insert 方法时使用此值 + 注意:如果是 getdate() 这种请可考虑使用 ServerTime,因为它对数据库间作了适配 + + + + + + + decimal/numeric 类型的长度/小数位长度 + + 总长度 + 小数位长度 + + + + + 重写功能 + 比如:[Column(RewriteSql = "geography::STGeomFromText({0},4236)")] + 插入:INSERT INTO [table]([geo]) VALUES(geography::STGeomFromText('...',4236)) + 提示:更新也生效 + + + + + + + 重读功能 + 比如:[Column(RereadSql = "{0}.STAsText()")] + 查询:SELECT a.[id], a.[geo].STAsText() FROM [table] a + + + + + + + 自定义表达式函数解析 + 注意:请使用静态方法、或者在类上标记 + + + + + 自定义表达式函数解析的时候,指定参数不解析 SQL,而是直接传进来 + + + + + 数据库类型,可用于适配多种数据库环境 + + + + + 已解析的表达式中参数内容 + + + + + 表达式原始值 + + + + + 主对象的参数化对象,可重塑其属性 + + + + + 可附加参数化对象 + 注意:本属性只有 Where 的表达式解析才可用 + + + + + 将 c# 对象转换为 SQL + + + + + 返回表达式函数表示的 SQL 字符串 + + + + + 获取实体元数据 + + + + + + + 解析表达式 + + + + + + + (非公开)内部公共工具类方法 + + + + + 索引设置,如:[Index("{tablename}_idx_01", "name")] + + + + + 索引设置,如:[Index("{tablename}_idx_01", "name")] + + 索引名v1.7.0 增加占位符 {TableName} 表名区分索引名 (解决 AsTable 分表 CodeFirst 导致索引名重复的问题) + 索引字段,为属性名以逗号分隔,如:Create_time ASC, Title ASC + + + + 索引设置,如:[Index("{tablename}_idx_01", "name", true)] + + 索引名v1.7.0 增加占位符 {TableName} 表名区分索引名 (解决 AsTable 分表 CodeFirst 导致索引名重复的问题) + 索引字段,为属性名以逗号分隔,如:Create_time ASC, Title ASC + 是否唯一 + + + + 索引名 + v1.7.0 增加占位符 {TableName} 表名区分索引名 (解决 AsTable 分表 CodeFirst 导致索引名重复的问题) + + + + + 索引字段,为属性名以逗号分隔,如:Create_time ASC, Title ASC + + + + + 是否唯一 + + + + + OneToOne:[Navigate(nameof(Primary))] <-> (缺省)外表.Primary + ManyToOne:Topic.cs 文件 [Navigate(nameof(Topic.CategoryId))] <-> (缺省)Category.Id + _________________public Category Category { get; set; } + OneToMany:Category.cs 文件 (缺省)Category.Id <-> [Navigate(nameof(Topic.CategoryId))] + _________________public List<Topic> Topics { get; set; } + + + + + OneToOne:[Navigate(nameof(Primary))] <-> (缺省)外表.Primary + ManyToOne:Topic.cs 文件 [Navigate(nameof(Topic.CategoryId))] <-> (缺省)Category.Id + _________________public Category Category { get; set; } + OneToMany:Category.cs 文件 (缺省)Category.Id <-> [Navigate(nameof(Topic.CategoryId))] + _________________public List<Topic> Topics { get; set; } + + + + + 与非主键进行关联,仅支持 OneToMany、ManyToOne + 使用方法参考 Bind 属性 + + + + + 手工绑定 ManyToMany 导航关系 + + + + + OneToOne:[Navigate(nameof(Primary))] <-> (缺省)外表.Primary + ManyToOne:Topic.cs 文件 [Navigate(nameof(Topic.CategoryId))] <-> (缺省)Category.Id + _________________public Category Category { get; set; } + OneToMany:Category.cs 文件 (缺省)Category.Id <-> [Navigate(nameof(Topic.CategoryId))] + _________________public List<Topic> Topics { get; set; } + + + + + 主键名 + + + + + 数据库表名 + + + + + 指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】 + + + + + 禁用 CodeFirst 同步结构迁移 + + + + + 格式:属性名=开始时间(递增) + 按年分表:[Table(Name = "log_{yyyy}", AsTable = "create_time=2022-1-1(1 year)")] + 按月分表:[Table(Name = "log_{yyyyMM}", AsTable = "create_time=2022-5-1(1 month)")] + 按日分表:[Table(Name = "log_{yyyyMMdd}", AsTable = "create_time=2022-5-1(5 day)")] + 按时分表:[Table(Name = "log_{yyyyMMddHH}", AsTable = "create_time=2022-5-1(6 hour)")] + + + + + 可以匹配以下条件(支持参数化): + `field` BETWEEN '2022-01-01 00:00:00' AND '2022-03-01 00:00:00' + `field` > '2022-01-01 00:00:00' AND `field` < '2022-03-01 00:00:00' + `field` > '2022-01-01 00:00:00' AND `field` <= '2022-03-01 00:00:00' + `field` >= '2022-01-01 00:00:00' AND `field` < '2022-03-01 00:00:00' + `field` >= '2022-01-01 00:00:00' AND `field` <= '2022-03-01 00:00:00' + `field` > '2022-01-01 00:00:00' + `field` >= '2022-01-01 00:00:00' + `field` < '2022-01-01 00:00:00' + `field` <= '2022-01-01 00:00:00' + + + + + + + 数据库表名 + + + + + 指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】 + + + + + 禁用 CodeFirst 同步结构迁移 + + + + + 导航关系Fluent,与 NavigateAttribute 对应 + + + + 多对多关系的中间实体类型 + + + + + 设置实体的索引 + + 索引名 + 索引字段,为属性名以逗号分隔,如:Create_time ASC, Title ASC + 是否唯一 + + + + + 数据库表名 + + + + + 指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,CodeFirst才可以正确修改数据库表;否则将视为【创建新表】 + + + + + 禁用 CodeFirst 同步结构迁移 + + + + + 导航关系Fluent,与 NavigateAttribute 对应 + + + + + 多对多关系的中间实体类型 + + + + + 设置实体的索引 + + 索引名 + 索引字段,为属性名以逗号分隔,如:Create_time ASC, Title ASC + 是否唯一 + + + + + 所属表 + + + + + 列名 + + + + + 映射到 C# 类型 + + + + + 数据库枚举类型int值 + + + + + 数据库类型,字符串,varchar + + + + + 数据库类型,字符串,varchar(255) + + + + + 最大长度 + + + + + 主键 + + + + + 自增标识 + + + + + 是否可DBNull + + + + + 备注,早期编码时少按了一个字母,请使用 Comment + + + + + 备注 + + + + + 数据库默认值 + + + + + 字段位置 + + + + + 枚举类型标识 + + + + + 枚举项 + + + + + 唯一标识 + + + + + SqlServer下是Owner、PostgreSQL下是Schema、MySql下是数据库名 + + + + + 表名 + + + + + 表备注,SqlServer下是扩展属性 MS_Description + + + + + 表/视图 + + + + + 列 + + + + + 自增列 + + + + + 主键/组合 + + + + + 唯一键/组合 + + + + + 索引/组合 + + + + + 外键 + + + + + 类型标识 + + + + + 枚举项 + + + + + 通用的 Odbc 实现,只能做基本的 Crud 操作 + 不支持实体结构迁移、不支持分页(只能 Take 查询) + + 通用实现为了让用户自己适配更多的数据库,比如连接 mssql 2000、db2 等数据库 + 默认适配 SqlServer,可以继承后重新适配 FreeSql.Odbc.Default.OdbcAdapter,最好去看下代码 + + 适配新的 OdbcAdapter,请在 FreeSqlBuilder.Build 之后调用 IFreeSql.SetOdbcAdapter 方法设置 + + + + + 武汉达梦数据库有限公司,基于 Odbc 的实现 + + + + + Microsoft Office Access 是由微软发布的关联式数据库管理系统 + + + + + 武汉达梦数据库有限公司,基于 DmProvider.dll 的实现 + + + + + 北京人大金仓信息技术股份有限公司,基于 Odbc 的实现 + + + + + 天津神舟通用数据技术有限公司,基于 System.Data.OscarClient.dll 的实现 + + + + + 北京人大金仓信息技术股份有限公司,基于 Kdbndp.dll 的实现 + + + + + Firebird 是一个跨平台的关系数据库,能作为多用户环境下的数据库服务器运行,也提供嵌入式数据库的实现 + + + + + 自定义适配器,访问任何数据库 + 注意:该类型不提供 DbFirst/CodeFirst 功能 + + + + + 天津南大通用数据技术股份有限公司成立于2004年,是国产数据库、大数据领域的知名企业,基于 Odbc 的实现 + + + + + 获取 IDbConnection 对应的 IFreeSql 实例 + + + + + + + 插入数据 + + + + + + + 插入数据,传入实体 + + + + + + + + + 插入数据,传入实体数组 + + + + + + + + + 插入数据,传入实体集合 + + + + + + + + + 插入数据,传入实体集合 + + + + + + + + + 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: + 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 + Firebird: merge 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} + + + + 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 + + + + + 多表查询 + + + + + + + 多表查询 + + + + + + + 多表查询 + + + + + + + 多表查询 + + + + + + + 多表查询 + + + + + + + 多表查询 + + + + + + + 多表查询 + + + + + + + 多表查询 + + + + + + + 多表查询 + + + + + + + 插入数据 + + + + + + + 插入数据,传入实体 + + + + + + + + + 插入数据,传入实体数组 + + + + + + + + + 插入数据,传入实体集合 + + + + + + + + + 插入数据,传入实体集合 + + + + + + + + + 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: + 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} + + + + 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 + + + + + 多表查询 + + + + + + 多表查询 + + + + + + 多表查询 + + + + + + 多表查询 + + + + + + 多表查询 + + + + + + 多表查询 + + + + + + 多表查询 + + + + + + 多表查询 + + + + + + 多表查询 + + + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null + + + + + 当Guid无值时,会生成有序的新值 + + + + + + 获取实体的主键值,多个主键返回数组 + + + + + + + + + 获取实体的属性值 + + + + + + + + + + 获取实体的所有数据,以 (1, 2, xxx) 的形式 + + + + + + + + + 使用新实体的值,复盖旧实体的值 + + + + + 使用新实体的主键值,复盖旧实体的主键值 + + + + + 设置实体中主键内的自增字段值(若存在) + + + + + + + + + 获取实体中主键内的自增字段值(若存在) + + + + + + + + 清除实体的主键值,将自增、Guid类型的主键值清除 + + + + + + + + 清除实体的主键值,将自增、Guid类型的主键值清除 + + + + + + + + 对比两个实体值,返回相同/或不相同的列名 + + + + + + + + + + + 设置实体中某属性的数值增加指定的值 + + + + + + + + + + 设置实体中某属性的值 + + + + + + + + + + 缓存执行 IUpdate.Set + + + + + + + + + SqlExt 是利用自定表达式函数解析功能,解析默认常用的SQL函数,欢迎 PR + + + + + rank() over(order by ...) + + + + + + dense_rank() over(order by ...) + + + + + + count() over(order by ...) + + + + + + sum(..) over(order by ...) + + + + + + + avg(..) over(order by ...) + + + + + + max(..) over(order by ...) + + + + + + + + min(..) over(order by ...) + + + + + + + + SqlServer row_number() over(order by ...) + + + + + + isnull、ifnull、coalesce、nvl + + + + + + + + + count(distinct name) + + + + + + + + 注意:使用者自己承担【注入风险】 + + + + + + + 大于 > + + + + + + 大于或等于 >= + + + + + + 小于 < + + + + + + 小于或等于 <= + + + + + + case when .. then .. end + + + + + + case when .. then .. end + + + + + + + + + + MySql group_concat(distinct .. order by .. separator ..) + + + + + + + MySql find_in_set(str, strlist) + + + + + + + + + PostgreSQL string_agg(.., ..) + + + + + + + + 使用连接串(推荐) + + 数据库类型 + 数据库连接串 + 提供者的类型,一般不需要指定,如果一直提示“缺少 FreeSql 数据库实现包:FreeSql.Provider.MySql.dll,可前往 nuget 下载”的错误,说明反射获取不到类型,此时该参数可排上用场例如:typeof(FreeSql.SqlServer.SqlServerProvider<>) + + + + + 使用从数据库,支持多个 + + 从数据库连接串 + + + + + 使用自定义数据库连接对象(放弃内置对象连接池技术) + + 数据库类型 + 数据库连接对象创建器 + 提供者的类型,一般不需要指定,如果一直提示“缺少 FreeSql 数据库实现包:FreeSql.Provider.MySql.dll,可前往 nuget 下载”的错误,说明反射获取不到类型,此时该参数可排上用场例如:typeof(FreeSql.SqlServer.SqlServerProvider<>) + + + + + 【开发环境必备】自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改 + 注意:生产环境中谨慎使用 + + true:运行时检查自动同步结构, false:不同步结构(默认) + + + + + 将数据库的主键、自增、索引设置导入,适用 DbFirst 模式,无须在实体类型上设置 [Column(IsPrimary)] 或者 ConfigEntity。此功能目前可用于 mysql/sqlserver/postgresql/oracle。 + 本功能会影响 IFreeSql 首次访问的速度。 + 若使用 CodeFirst 创建索引后,又直接在数据库上建了索引,若无本功能下一次 CodeFirst 迁移时数据库上创建的索引将被删除 + + + + + + + 不使用命令参数化执行,针对 Insert/Update,也可临时使用 IInsert/IUpdate.NoneParameter() + + + + + + + 是否生成命令参数化执行,针对 lambda 表达式解析 + 注意:常量不会参数化,变量才会做参数化 + var id = 100; + fsql.Select<T>().Where(a => a.id == id) 会参数化 + fsql.Select<T>().Where(a => a.id == 100) 不会参数化 + + + + + + + 延时加载导航属性对象,导航属性需要声明 virtual + + + + + + + 监视数据库命令对象 + + 执行前 + 执行后,可监视执行性能 + + + + + 实体类名 -> 数据库表名,命名转换(类名、属性名都生效) + 优先级小于 [Column(Name = "xxx")] + + + + + + + SQL名称是否使用 [] `` "" + true: SELECT .. FROM [table] + false: SELECT .. FROM table + + + + + + + 指定映射优先级 + 例如表名:实体类名 < Aop < FluentApi < Attribute < AsTable + 事件 Aop -------> fsql.Aop.ConfigEntity/fsql.Aop.ConfigEntityProperty + 方法 FluentApi -> fsql.CodeFirst.ConfigEntity/fsql.CodeFirst.Entity + 特性 Attribute -> [Table(Name = xxx, ...)] + ----------------------------------------------------------------------------- + 默认规则:关于映射优先级,Attribute 可以更直观排查问题,即使任何地方使用 FluentApi/Aop 设置 TableName 都不生效。 + 调整规则:UseMappingPriority(Attribute, FluentApi, Aop) + 实体类名 < Attribute < FluentApi < Aop < AsTable + + + + + + + + + + 监听 AppDomain.CurrentDomain.ProcessExit/Console.CancelKeyPress 事件自动释放连接池 + 默认值: true + + + + + + + 指定事务对象 + + + + + + + 指定事务对象 + + + + + + + 命令超时设置(秒) + + + + + + + lambda表达式条件,仅支持实体基础成员(不包含导航对象) + 若想使用导航对象,请使用 ISelect.ToDelete() 方法 + + lambda表达式条件 + + + + + lambda表达式条件,仅支持实体基础成员(不包含导航对象) + 若想使用导航对象,请使用 ISelect.ToUpdate() 方法 + + true 时生效 + lambda表达式条件 + + + + + 原生sql语法条件,Where("id = @id", new { id = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + sql语法条件 + 参数 + + + + + 原生sql语法条件,Where("id = @id", new { id = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + true 时生效 + sql语法条件 + 参数 + + + + + 传入实体,将主键作为条件 + + 实体 + + + + + 传入实体集合,将主键作为条件 + + 实体集合 + + + + + 传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} + + 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 + 是否标识为NOT + + + + + 禁用全局过滤功能,不传参数时将禁用所有 + + 零个或多个过滤器名字 + + + + + 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; + + + + + + + 设置表名 + + + + + + + 动态Type,在使用 Delete<object> 后使用本方法,指定实体类型 + + + + + + + 返回即将执行的SQL语句 + + + + + + 执行SQL语句,返回影响的行数 + + + + + + 执行SQL语句,返回被删除的记录 + 注意:此方法只有 Postgresql/SqlServer 有效果 + + + + + + 指定事务对象 + + + + + + + 指定事务对象 + + + + + + + 命令超时设置(秒) + + + + + + + 追加准备插入的实体 + + 实体 + + + + + 追加准备插入的实体 + + 实体 + + + + + 追加准备插入的实体集合 + + 实体集合 + + + + + 只插入的列,InsertColumns(a => a.Name) | InsertColumns(a => new{a.Name,a.Time}) | InsertColumns(a => new[]{"name","time"}) + + lambda选择列 + + + + + 只插入的列 + + 属性名,或者字段名 + + + + + 忽略的列,IgnoreColumns(a => a.Name) | IgnoreColumns(a => new{a.Name,a.Time}) | IgnoreColumns(a => new[]{"name","time"}) + + lambda选择列 + + + + + 忽略的列 + + 属性名,或者字段名 + + + + + 指定可插入自增字段 + + + + + + 不使用参数化,可通过 IFreeSql.CodeFirst.IsNotCommandParameter 全局性设置 + + 是否不使用参数化 + + + + + 批量执行选项设置,一般不需要使用该方法 + 各数据库 values, parameters 限制不一样,默认设置: + MySql 5000 3000 + PostgreSQL 5000 3000 + SqlServer 1000 2100 + Oracle 500 999 + Sqlite 5000 999 + 若没有事务传入,内部(默认)会自动开启新事务,保证拆包执行的完整性。 + + 指定根据 values 上限数量拆分执行 + 指定根据 parameters 上限数量拆分执行 + 是否自动开启事务 + + + + + 批量执行时,分批次执行的进度状态 + + 批量执行时的回调委托 + + + + + 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; + + + + + + + 设置表名 + + + + + + + 动态Type,在使用 Insert<object> 后使用本方法,指定实体类型 + + + + + + + 返回即将执行的SQL语句 + + + + + + 执行SQL语句,返回影响的行数 + + + + + + 执行SQL语句,返回自增值 + 注意:请检查实体类是否标记了 [Column(IsIdentity = true)] + + + + + + 执行SQL语句,返回插入后的记录 + 注意:此方法只有 Postgresql/SqlServer 有效果 + + + + + + 返回 DataTable 以便做 BulkCopy 数据做准备 + 此方法会处理: + 类型、表名、字段名映射 + IgnoreColumns、InsertColumns + + + + + + 指定事务对象 + + + + + + + 指定事务对象 + + + + + + + 命令超时设置(秒) + + + + + + + 添加或更新,设置实体 + + 实体 + + + + + 添加或更新,设置实体 + + 实体 + + 根据临时主键插入或更新,a => a.Name | a => new{a.Name,a.Time} | a => new[]{"name","time"} + 注意:不处理自增,因某些数据库依赖主键或唯一键,所以指定临时主键仅对 SqlServer/PostgreSQL/Firebird/达梦/南大通用/金仓/神通 有效 + + + + + + 添加或更新,设置实体集合 + + 实体集合 + + 根据临时主键插入或更新,a => a.Name | a => new{a.Name,a.Time} | a => new[]{"name","time"} + 注意:不处理自增,因某些数据库依赖主键或唯一键,所以指定临时主键仅对 SqlServer/PostgreSQL/Firebird/达梦/南大通用/金仓/神通 有效 + + + + + + 添加或更新,设置SQL + + 查询SQL + + 根据临时主键插入或更新,a => a.Name | a => new{a.Name,a.Time} | a => new[]{"name","time"} + 注意:不处理自增,因某些数据库依赖主键或唯一键,所以指定临时主键仅对 SqlServer/PostgreSQL/Firebird/达梦/南大通用/金仓/神通 有效 + + + + + + 当记录存在时,什么都不做 + 换句话:只有记录不存在时才插入 + + + + + + 当记录存在时,指定只更新的字段,UpdateColumns(a => a.Name) | UpdateColumns(a => new{a.Name,a.Time}) | UpdateColumns(a => new[]{"name","time"}) + + lambda选择列 + + + + + 当记录存在时,指定只更新的字段 + + 属性名,或者字段名 + + + + + 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; + + + + + + + 设置表名 + + + + + + + 动态Type,在使用 Update<object> 后使用本方法,指定实体类型 + + + + + + + 返回即将执行的SQL语句 + + + + + + 执行SQL语句,返回影响的行数 + + + + + + 自动产生 as1, as2, as3 .... 字段别名 + 这种方法可以最大程度防止多表,存在相同字段的问题 + + + + + 使用属性名作为字段别名 + + + + + 控制取消本次查询 + * 不会产生额外的异常 + * 取消成功,则不执行 SQL 命令 + * 取消成功,直接返回没有记录时候的返回值 + * 取消成功,如 List<T> 返回 0 元素列表,不是 null,仍然是旧机制 + + 返回 true,则不会执行 SQL 命令 + + + + + 指定事务对象 + + + + + + + 指定连接对象 + + + + + + + 使用自定义参数化,UnionALL 或者 ToSql 可能有需要 + + + + + + + 命令超时设置(秒) + + + + + + + 审核或跟踪 ToList 即将返回的数据 + + + + + + + 执行SQL查询,返回 DataTable + + + + + + 执行SQL查询,返回 properties 指定的实体类属性,并以 DataTable 接收 + + 属性名:Name导航属性:Parent.Name多表:b.Name + + + + + 以字典的形式返回查询结果 + 注意:字典的特点会导致返回的数据无序 + + + + + + + + 执行SQL查询,返回 T1 实体所有字段的记录,记录不存在时返回 Count 为 0 的列表 + 注意: + 1、ToList(a => a) 可以返回 a 所有实体 + 2、ToList(a => new { a }) 这样也可以 + 3、ToList((a, b, c) => new { a, b, c }) 这样也可以 + 4、abc 怎么来的?请试试 fsql.Select<T1, T2, T3>() + + + + + + 执行SQL查询,返回 T1 实体、以及 LeftJoin/InnerJoin/RightJoin 对象 + + false: 返回 2级 LeftJoin/InnerJoin/RightJoin 对象;true: 返回所有 LeftJoin/InnerJoin/RightJoin 的导航数据 + + + + + 执行SQL查询,分块返回数据,可减少内存开销。比如读取10万条数据,每次返回100条处理。 + + 数据块的大小 + 处理数据块 + false: 返回 2级 LeftJoin/InnerJoin/RightJoin 对象;true: 返回所有 LeftJoin/InnerJoin/RightJoin 的导航数据 + + + + 执行SQL查询,返回 field 指定字段的记录,并以元组或基础类型(int,string,long)接收,记录不存在时返回 Count 为 0 的列表 + + + + + + + + 执行SQL查询,返回 T1 实体所有字段的第一条记录,记录不存在时返回 null + + + + + + 执行SQL查询,返回 T1 实体所有字段的第一条记录,记录不存在时返回 null + + + + + + 将查询转为删除对象,以便支持导航对象或其他查询功能删除数据,如下: + fsql.Select<T1>().Where(a => a.Options.xxx == 1).ToDelete().ExecuteAffrows() + 注意:此方法不是将数据查询到内存循环删除,上面的代码产生如下 SQL 执行: + DELETE FROM `T1` WHERE id in (select a.id from T1 a left join Options b on b.t1id = a.id where b.xxx = 1) + 复杂删除使用该方案的好处: + 1、删除前可预览测试数据,防止错误删除操作; + 2、支持更加复杂的删除操作(IDelete 默认只支持简单的操作); + + + + + + 将查询转为更新对象,以便支持导航对象或其他查询功能更新数据,如下: + fsql.Select<T1>().Where(a => a.Options.xxx == 1).ToUpdate().Set(a => a.Title, "111").ExecuteAffrows() + 注意:此方法不是将数据查询到内存循环更新,上面的代码产生如下 SQL 执行: + UPDATE `T1` SET Title = '111' WHERE id in (select a.id from T1 a left join Options b on b.t1id = a.id where b.xxx = 1) + 复杂更新使用该方案的好处: + 1、更新前可预览测试数据,防止错误更新操作; + 2、支持更加复杂的更新操作(IUpdate 默认只支持简单的操作); + + + + + + 设置表名规则,可用于分库/分表,参数1:实体类型;参数2:默认表名;返回值:新表名; + 设置多次,可查询分表后的多个子表记录,以 UNION ALL 形式执行。 + 如:select.AsTable((type, oldname) => "table_1").AsTable((type, oldname) => "table_2").AsTable((type, oldname) => "table_3").ToSql(a => a.Id); + select * from (SELECT a."Id" as1 FROM "table_1" a) ftb + UNION ALL select * from (SELECT a."Id" as1 FROM "table_2" a) ftb + UNION ALL select * from (SELECT a."Id" as1 FROM "table_3" a) ftb + 还可以这样:select.AsTable((a, b) => "(select * from tb_topic where clicks > 10)").Page(1, 10).ToList() + + + + + + + 设置别名规则,可用于拦截表别名,实现类似 sqlserver 的 with(nolock) 需求 + 如:select.AsAlias((_, old) => $"{old} with(lock)") + + + + + + + 动态Type,在使用 Select<object> 后使用本方法,指定实体类型 + + + + + + + 返回即将执行的SQL语句 + + 指定字段 + + + + + 执行SQL查询,是否有记录 + + + + + + 查询的记录数量 + + + + + + 查询的记录数量,以参数out形式返回 + + 返回的变量 + + + + + 指定从主库查询(默认查询从库) + + + + + + 左联查询,使用导航属性自动生成SQL + + 表达式 + + + + + 联接查询,使用导航属性自动生成SQL + + 表达式 + + + + + 右联查询,使用导航属性自动生成SQL + + 表达式 + + + + + 左联查询,指定关联的实体类型 + + 关联的实体类型 + 表达式 + + + + + 联接查询,指定关联的实体类型 + + 关联的实体类型 + 表达式 + + + + + 右联查询,指定关联的实体类型 + + 关联的实体类型 + 表达式 + + + + + 左联查询,使用原生sql语法,LeftJoin("type b on b.id = a.id and b.clicks > @clicks", new { clicks = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + sql语法条件 + 参数 + + + + + 联接查询,使用原生sql语法,InnerJoin("type b on b.id = a.id and b.clicks > @clicks", new { clicks = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + sql语法条件 + 参数 + + + + + 右联查询,使用原生sql语法,RightJoin("type b on b.id = a.id and b.clicks > @clicks", new { clicks = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + sql语法条件 + 参数 + + + + + 在 JOIN 位置插入 SQL 内容 + 如:.RawJoin("OUTER APPLY ( select id from t2 ) b") + + + + + + + 原生sql语法条件,Where("id = @id", new { id = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + sql语法条件 + 参数 + + + + + 原生sql语法条件,WhereIf(true, "id = @id", new { id = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + true 时生效 + sql语法条件 + 参数 + + + + + 动态过滤条件 + + + + + + + 禁用全局过滤功能,不传参数时将禁用所有 + + 零个或多个过滤器名字 + + + + + 排他更新锁 + 注意:务必在开启事务后使用该功能 + MySql: for update + SqlServer: With(UpdLock, RowLock, NoWait) + PostgreSQL: for update nowait + Oracle: for update nowait + Sqlite: 无效果 + 达梦: for update nowait + 人大金仓: for update nowait + 神通: for update + + noawait + + + + + 按原生sql语法分组,GroupBy("concat(name, @cc)", new { cc = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + sql语法 + 参数 + + + + + 按原生sql语法聚合条件过滤,Having("count(name) = @cc", new { cc = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + sql语法条件 + 参数 + + + + + 按原生sql语法排序,OrderBy("count(name) + @cc desc", new { cc = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + sql语法 + 参数 + + + + + 按原生sql语法排序,OrderBy(true, "count(name) + @cc desc", new { cc = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + true 时生效 + sql语法 + 参数 + + + + + 按属性名字符串排序(支持导航属性) + 属性名:Name导航属性:Parent.Name多表:b.Name + + 属性名:Name导航属性:Parent.Name多表:b.Name + 顺序 | 倒序 + + + + + 按属性名字符串排序(支持导航属性) + 属性名:Name导航属性:Parent.Name多表:b.Name + + true 时生效 + 属性名:Name导航属性:Parent.Name多表:b.Name + 顺序 | 倒序 + + + + + 查询向后偏移行数 + + + + + + + 查询向后偏移行数 + + 行数 + + + + + 查询多少条数据 + + + + + + + 查询多少条数据 + + + + + + + 分页 + + 第几页 + 每页多少 + + + + + 分页 + + 分页信息 + + + + + 查询数据前,去重 + + .Distinct().ToList(x => x.GroupName) 对指定字段去重 + + + .Distinct().ToList() 对整个查询去重 + + + + + + + 执行SQL查询,是否有记录 + + lambda表达式 + + + + + 将查询转换为 INSERT INTO tableName SELECT ... FROM t 执行插入 + + + 指定插入的表名,若为 null 则使用 TTargetEntity 实体表名 + 选择列 + 返回影响的行数 + + + + 执行SQL查询,返回 DataTable + + + + + + 执行SQL查询,返回指定字段的记录,记录不存在时返回 Count 为 0 的列表 + + 返回类型 + 选择列 + + + + + 执行SQL查询,返回 TDto 映射的字段,记录不存在时返回 Count 为 0 的列表 + + + + + + + 执行SQL查询,分块返回数据,可减少内存开销。比如读取10万条数据,每次返回100条处理。 + + 返回类型 + 选择列 + 数据块的大小 + 处理数据块 + + + + 执行SQL查询,返回指定字段的记录的第一条记录,记录不存在时返回 TReturn 默认值 + + 返回类型 + 选择列 + + + + + 执行SQL查询,返回 TDto 映射的字段,记录不存在时返回 Dto 默认值 + + + + + + + 执行SQL查询,返回指定字段的记录的第一条记录,记录不存在时返回 TReturn 默认值 + + 返回类型 + 选择列 + + + + + 执行SQL查询,返回 TDto 映射的字段,记录不存在时返回 Dto 默认值 + + + + + + + 返回即将执行的SQL语句 + + 返回类型 + 选择列 + 字段别名 + + + + + 执行SQL查询,返回指定字段的聚合结果 + + + + + + + + 执行SQL查询,返回指定字段的聚合结果给 output 参数 + fsql.Select<T>() + .Aggregate(a => new { count = a.Count, sum = a.Sum(a.Key.Price) }, out var agg) + .Page(1, 10).ToList(); + + + + + + + + + 求和 + + 返回类型 + 列 + + + + + 最小值 + + 返回类型 + 列 + + + + + 最大值 + + 返回类型 + 列 + + + + + 平均值 + + 返回类型 + 列 + + + + + 指定别名 + + 别名 + + + + + 多表查询 + + + + + + + + 查询条件,Where(a => a.Id > 10),支持导航对象查询,Where(a => a.Author.Email == "2881099@qq.com") + + lambda表达式 + + + + + 查询条件,Where(true, a => a.Id > 10),支导航对象查询,Where(true, a => a.Author.Email == "2881099@qq.com") + + true 时生效 + lambda表达式 + + + + + 多表条件查询 + + + lambda表达式 + + + + + 多表条件查询 + + + lambda表达式 + + + + + 多表条件查询 + + + + lambda表达式 + + + + + 多表条件查询 + + + + + lambda表达式 + + + + + 多表条件查询 + + + + + + lambda表达式 + + + + + 传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} + + 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 + 是否标识为NOT + + + + + 多表查询时,该方法标记后,表达式条件将对所有表进行附加 + + 例如:软删除、租户,每个表都给条件,挺麻烦的 + + fsql.Select<T1>().LeftJoin<T2>(...).Where<T2>((t1, t2 => t1.IsDeleted == false && t2.IsDeleted == false) + + 修改:fsql.Select<T1>().LeftJoin<T2>(...).WhereCascade(t1 => t1.IsDeleted == false) + + 当其中的实体可附加表达式才会进行,表越多时收益越大 + + + + + + + 按选择的列分组,GroupBy(a => a.Name) | GroupBy(a => new{a.Name,a.Time}) + + + + + + + 按列排序,OrderBy(a => a.Time) + + + + + + + + 按列排序,OrderBy(true, a => a.Time) + + + true 时生效 + + + + + + 按列排序,OrderByIf(true, a => a.Time) + + + true 时生效 + + true: DESC, false: ASC + + + + + 按列倒向排序,OrderByDescending(a => a.Time) + + 列 + + + + + 按列倒向排序,OrderByDescending(true, a => a.Time) + + true 时生效 + 列 + + + + + 贪婪加载导航属性,如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需此操作 + + + 选择一个导航属性 + + + + + 贪婪加载导航属性,如果查询中已经使用了 a.Parent.Parent 类似表达式,则可以无需此操作 + + + true 时生效 + 选择一个导航属性 + + + + + 贪婪加载集合的导航属性,其实是分两次查询,ToList 后进行了数据重装 + 文档:https://github.com/dotnetcore/FreeSql/wiki/%E8%B4%AA%E5%A9%AA%E5%8A%A0%E8%BD%BD + + + 选择一个集合的导航属性,如: .IncludeMany(a => a.Tags) + 可以 .Where 设置临时的关系映射,如: .IncludeMany(a => a.Tags.Where(tag => tag.TypeId == a.Id)) + 可以 .Take(5) 每个子集合只取5条,如: .IncludeMany(a => a.Tags.Take(5)) + 可以 .Select 设置只查询部分字段,如: (a => new TNavigate { Title = a.Title }) + + 即能 ThenInclude,还可以二次过滤(这个 EFCore 做不到?) + + + + + 按属性名字符串进行 Include/IncludeMany 操作 + + + + + + + 按属性名字符串进行 Include/IncludeMany 操作 + + true 时生效 + + + + + + 实现 select .. from ( select ... from t ) a 这样的功能 + 使用 AsTable 方法也可以达到效果 + 示例:WithSql("select * from id=@id", new { id = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + SQL语句 + 参数 + + + + + 实现 select .. from ( select .. UNION ALL select .. ) a 这样的功能(基于内存数据) + + 内存数据 + + + + + 嵌套查询 select * from ( select ... from table ... ) a + + + + + + + + 查询条件,Where(a => a.Id > 10),支持导航对象查询,Where(a => a.Author.Email == "2881099@qq.com") + + lambda表达式 + + + + + 查询条件,Where(true, a => a.Id > 10),支导航对象查询,Where(true, a => a.Author.Email == "2881099@qq.com") + + true 时生效 + lambda表达式 + + + + + 按列排序,OrderBy(a => a.Time) + + + + + + + + 按列倒向排序,OrderByDescending(a => a.Time) + + 列 + + + + + 按聚合条件过滤,Having(a => a.Count() > 10) + + lambda表达式 + + + + + 按聚合条件过滤,HavingIf(true, a => a.Count() > 10) + + true 时生效 + lambda表达式 + + + + + 按列排序,OrderBy(a => a.Time) + + + + + + + + 按列倒向排序,OrderByDescending(a => a.Time) + + 列 + + + + + 执行SQL查询,返回指定字段的记录,记录不存在时返回 Count 为 0 的列表 + + 返回类型 + 选择列 + + + + + 执行SQL查询,返回指定字段的记录的第一条记录,记录不存在时返回 TReturn 默认值 + + + + + + + + 【linq to sql】专用方法,不建议直接使用 + + + + + 返回即将执行的SQL语句 + + 返回类型 + 选择列 + + + + + + 返回即将执行的SQL语句 + + 指定字段 + + + + + 嵌套查询 select * from ( select ... from table group by ... ) a + + + + + + + + 查询向后偏移行数 + + + + + + + 查询向后偏移行数 + + 行数 + + + + + 查询多少条数据 + + + + + + + 查询多少条数据 + + + + + + + 分页 + + 第几页 + 每页多少 + + + + + 分页 + + 分页信息 + + + + + 查询的记录数量 + + + + + + 查询的记录数量,以参数out形式返回 + + 返回的变量 + + + + + 分组的数据 + + + + + 记录总数 + + + + + + 求和 + + + + + + + + 平均值 + + + + + + + + 最大值 + + + + + + + + 最小值 + + + + + + + 所有元素 + + + + + 指定事务对象 + + + + + + + 指定事务对象 + + + + + + + 命令超时设置(秒) + + + + + + + 不使用参数化,可通过 IFreeSql.CodeFirst.IsNotCommandParameter 全局性设置 + + 是否不使用参数化 + + + + + 批量执行选项设置,一般不需要使用该方法 + 各数据库 rows, parameters 限制不一样,默认设置: + MySql 500 3000 + PostgreSQL 500 3000 + SqlServer 500 2100 + Oracle 200 999 + Sqlite 200 999 + 若没有事务传入,内部(默认)会自动开启新事务,保证拆包执行的完整性。 + + 指定根据 rows 上限数量拆分执行 + 指定根据 parameters 上限数量拆分执行 + 是否自动开启事务 + + + + + 批量执行时,分批次执行的进度状态 + + 批量执行时的回调委托 + + + + + 更新数据,设置更新的实体 + 注意:实体必须定义主键,并且最终会自动附加条件 where id = source.Id + + 实体 + + + + + 更新数据,设置更新的实体集合 + 注意:实体必须定义主键,并且最终会自动附加条件 where id in (source.Id) + + 实体集合 + 根据临时主键更新,a => a.Name | a => new{a.Name,a.Time} | a => new[]{"name","time"} + 忽略 IsVersion 乐观锁版本号 + + + + + 更新数据,设置更新的实体,同时设置忽略的列 + 忽略 null 属性:fsql.Update<T>().SetSourceAndIgnore(item, colval => colval == null) + 注意:参数 ignore 与 IUpdate.IgnoreColumns/UpdateColumns 不能同时使用 + + 实体 + 属性值忽略判断, true忽略 + + + + + 忽略的列,IgnoreColumns(a => a.Name) | IgnoreColumns(a => new{a.Name,a.Time}) | IgnoreColumns(a => new[]{"name","time"}) + 注意:不能与 UpdateColumns 不能同时使用 + + lambda选择列 + + + + + 忽略的列 + 注意:不能与 UpdateColumns 不能同时使用 + + 属性名,或者字段名 + + + + + 指定的列,UpdateColumns(a => a.Name) | UpdateColumns(a => new{a.Name,a.Time}) | UpdateColumns(a => new[]{"name","time"}) + 注意:不能与 IgnoreColumns 不能同时使用 + + lambda选择列 + + + + + 指定的列 + 注意:不能与 IgnoreColumns 同时使用 + + 属性名,或者字段名 + + + + + 设置列的新值,Set(a => a.Name, "newvalue") + + + lambda选择列 + 新值 + + + + + 设置列的新值,Set(a => a.Name, "newvalue") + + + true 时生效 + lambda选择列 + 新值 + + + + + 设置列的的新值为基础上增加,格式:Set(a => a.Clicks + 1) 相当于 clicks=clicks+1 + + 指定更新,格式:Set(a => new T { Clicks = a.Clicks + 1, Time = DateTime.Now }) 相当于 set clicks=clicks+1,time='2019-06-19....' + + + + + + + + 设置列的的新值为基础上增加,格式:Set(a => a.Clicks + 1) 相当于 clicks=clicks+1 + + 指定更新,格式:Set(a => new T { Clicks = a.Clicks + 1, Time = DateTime.Now }) 相当于 set clicks=clicks+1,time='2019-06-19....' + + + true 时生效 + + + + + + 设置值,自定义SQL语法,SetRaw("title = @title", new { title = "newtitle" }) + 提示:parms 参数还可以传 Dictionary<string, object> + + sql语法 + 参数 + + + + + 设置更新的列 + SetDto(new { title = "xxx", clicks = 2 }) + SetDto(new Dictionary<string, object> { ["title"] = "xxx", ["clicks"] = 2 }) + 注意:标记 [Column(CanUpdate = false)] 的属性不会被更新 + + dto 或 Dictionary<string, object> + + + + + lambda表达式条件,仅支持实体基础成员(不包含导航对象) + 若想使用导航对象,请使用 ISelect.ToUpdate() 方法 + + lambda表达式条件 + + + + + lambda表达式条件,仅支持实体基础成员(不包含导航对象) + 若想使用导航对象,请使用 ISelect.ToUpdate() 方法 + + true 时生效 + lambda表达式条件 + + + + + 原生sql语法条件,Where("id = @id", new { id = 1 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + sql语法条件 + 参数 + + + + + 传入实体,将主键作为条件 + + 实体 + + + + + 传入实体集合,将主键作为条件 + + 实体集合 + + + + + 传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} + + 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 + 是否标识为NOT + + + + + 禁用全局过滤功能,不传参数时将禁用所有 + + 零个或多个过滤器名字 + + + + + 设置表名规则,可用于分库/分表,参数1:默认表名;返回值:新表名; + + + + + + + 设置表名 + + + + + + + 动态Type,在使用 Update<object> 后使用本方法,指定实体类型 + + + + + + + 返回即将执行的SQL语句 + + + + + + 执行SQL语句,返回影响的行数 + + + + + + 执行SQL语句,返回更新后的记录 + 注意:此方法只有 Postgresql/SqlServer 有效果 + + + + + + 主库连接池 + + + + + 从库连接池 + + + + + 数据库类型 + + + + + UseConnectionString 时候的值 + + + + + UseSalve 时候的值 + + + + + 唯一标识 + + + + + 开启事务(不支持异步) + + 事务体 () => {} + + + + 开启事务(不支持异步) + + + 事务体 () => {} + + + + 当前线程的事务 + + + + + 将 new { id = 1 } 或者 Dictionary<string, object> 转换为 DbParameter[] + + new { id = 1 } 或者 Dictionary<string, object> + + + + + SQL 命令执行类,fsql.Ado.CommandFluent("select * from user where age > @age", new { age = 25 }) + .WithConnection(connection) + .WithTransaction(transaction) + .WithParameter("age", 25) + .WithParameter("id", 11) + .CommandType(CommandType.Text) + .CommandTimeout(60) + .Query<T>(); 或者 ExecuteNonQuery/ExecuteScalar/ExecuteDataTable/ExecuteDataSet/ExecuteArray + + + + + + + + 测试数据库是否连接正确,本方法执行如下命令: + MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 + Oracle: SELECT 1 FROM dual + + 命令超时设置(秒) + true: 成功, false: 失败 + + + + 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 + + + + + + + + + 查询,ExecuteReader(dr => {}, "select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 查询 + + + + + + + + 查询,ExecuteArray("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 查询 + + + + + + + + 查询,ExecuteDataSet("select * from user where age > @age; select 2", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 查询 + + + + + + + + 查询,ExecuteDataTable("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 在【主库】执行 + + + + + + + + 在【主库】执行,ExecuteNonQuery("delete from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 在【主库】执行 + + + + + + + + 在【主库】执行,ExecuteScalar("select 1 from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + 执行SQL返回对象集合,Query<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 }) + + + + + + + + + + 执行SQL返回对象集合,Query<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>("select * from user where age > @age; select * from address", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + + + + + + + + + 可自定义解析表达式 + + + + + 自定义实体的配置,方便和多个 ORM 共同使用 + + + + + 自定义实体的属性配置,方便和多个 ORM 共同使用 + + + + + 增删查改,执行命令之前触发 + + + + + 增删查改,执行命令完成后触发 + + + + + CodeFirst迁移,执行之前触发 + + + + + CodeFirst迁移,执行完成触发 + + + + + Insert/Update自动值处理 + + + + + ADO.NET DataReader 拦截 + + + + + 监视数据库命令对象(执行前,调试) + + + + + 监视数据库命令对象(执行后,用于监视执行性能) + + + + + 跟踪开始 + + + + + 跟踪结束 + + + + + 内置解析功能,可辅助您进行解析 + + + + + 需要您解析的表达式 + + + + + 解析后的内容 + + + + + 实体类型 + + + + + 实体配置 + + + + + 索引配置 + + + + + 实体类型 + + + + + 实体的属性 + + + + + 实体的属性配置 + + + + + 标识符,可将 CurdBefore 与 CurdAfter 进行匹配 + + + + + 操作类型 + + + + + 实体类型 + + + + + 实体类型的元数据 + + + + + 执行的 SQL + + + + + 参数化命令 + + + + + 状态数据,可与 CurdAfter 共享 + + + + + 发生的错误 + + + + + 执行SQL命令,返回的结果 + + + + + 耗时(单位:Ticks) + + + + + 耗时(单位:毫秒) + + + + + 标识符,可将 SyncStructureBeforeEventArgs 与 SyncStructureAfterEventArgs 进行匹配 + + + + + 实体类型 + + + + + 状态数据,可与 SyncStructureAfter 共享 + + + + + 执行的 SQL + + + + + 发生的错误 + + + + + 耗时(单位:Ticks) + + + + + 耗时(单位:毫秒) + + + + + 类型 + + + + + 属性列的元数据 + + + + + 反射的属性信息 + + + + + 获取实体的属性值,也可以设置实体的属性新值 + + + + + 实体对象 + + + + + 中断实体对象审计 + false: 每个实体对象的属性都会审计(默认) + true: 每个实体对象只审计一次 + + + + + ADO.NET 数据流读取对象 + + + + + DataReader 对应的 Index 位置 + + + + + 获取 Index 对应的值,也可以设置拦截的新值 + + + + + 标识符,可将 CommandBefore 与 CommandAfter 进行匹配 + + + + + 状态数据,可与 CommandAfter 共享 + + + + + 发生的错误 + + + + + 执行SQL命令,返回的结果 + + + + + 耗时(单位:Ticks) + + + + + 耗时(单位:毫秒) + + + + + 标识符,可将 TraceBeforeEventArgs 与 TraceAfterEventArgs 进行匹配 + + + + + 状态数据,可与 TraceAfter 共享 + + + + + 备注 + + + + + 发生的错误 + + + + + 耗时(单位:Ticks) + + + + + 耗时(单位:毫秒) + + + + + 【开发环境必备】自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改 + + + + + 转小写同步结构,适用 PostgreSQL + + + + + 转大写同步结构,适用 Oracle/达梦/人大金仓 + + + + + 将数据库的主键、自增、索引设置导入,适用 DbFirst 模式,无须在实体类型上设置 [Column(IsPrimary)] 或者 ConfigEntity。此功能目前可用于 mysql/sqlserver/postgresql/oracle。 + 本功能会影响 IFreeSql 首次访问的速度。 + 若使用 CodeFirst 创建索引后,又直接在数据库上建了索引,若无本功能下一次 CodeFirst 迁移时数据库上创建的索引将被删除 + + + + + 不使用命令参数化执行,针对 Insert/Update + + + + + 是否生成命令参数化执行,针对 lambda 表达式解析 + 注意:常量不会参数化,变量才会做参数化 + var id = 100; + fsql.Select<T>().Where(a => a.id == id) 会参数化 + fsql.Select<T>().Where(a => a.id == 100) 不会参数化 + + + + + 延时加载导航属性对象,导航属性需要声明 virtual + + + + + 将实体类型与数据库对比,返回DDL语句 + + + + + + + 将实体类型集合与数据库对比,返回DDL语句 + + 实体类型 + + + + + 将实体类型与数据库对比,返回DDL语句(指定表名) + + 实体类型 + 指定表名对比 + + + + + 同步实体类型到数据库 + 注意:生产环境中谨慎使用 + + + + + + 同步实体类型集合到数据库 + 注意:生产环境中谨慎使用 + + + + + + 同步实体类型到数据库(指定表名) + 注意:生产环境中谨慎使用 + + 实体类型 + 指定表名对比 + 强制同步结构,无视缓存每次都同步 + + + + 根据 System.Type 获取数据库信息 + + + + + + + FreeSql FluentApi 配置实体,方法名与特性相同 + + + + + + + + FreeSql FluentApi 配置实体,方法名与特性相同 + + + + + + + + 获取 FreeSql FluentApi 配置实体的元数据 + + + 未使用ConfigEntity配置时,返回null + + + + 获取实体类核心配置 + + + + + + + 获取所有数据库 + + + + + + 获取指定数据库的表信息,包括表、列详情、主键、唯一键、索引、外键、备注 + + + + + + + 获取指定单表信息,包括列详情、主键、唯一键、索引、备注 + + 表名,如:dbo.table1 + 是否忽略大小写 + + + + + 判断表是否存在 + + 表名,如:dbo.table1 + 是否忽略大小写 + + + + + 获取数据库枚举类型int值 + + + + + + + 获取c#转换,(int)、(long) + + + + + + + 获取c#值 + + + + + + + 获取c#类型,int、long + + + + + + + 获取c#类型对象 + + + + + + + 获取ado.net读取方法, GetBoolean、GetInt64 + + + + + + + 序列化 + + + + + + + 反序列化 + + + + + + + 获取数据库枚举类型,适用 PostgreSQL + + + + + + + 临时 LambdaExpression.Parameter + + + + + 如果实体类有自增属性,分成两个 List,有值的Item1 merge,无值的Item2 insert + + + + + + + AsType, Ctor, ClearData 三处地方需要重新加载 + + + + + AsType, Ctor, ClearData 三处地方需要重新加载 + + + + + 动态读取 DescriptionAttribute 注释文本 + + + + + + + 通过属性的注释文本,通过 xml 读取 + + + Dict:key=属性名,value=注释 + + + + 更新实体的元数据 + + + + + 执行更新的 SQL + + + + + 执行更新命令的参数 + + + + + 执行更新命令影响的行 + + + + + 更新的实体数量 + + + + + 更新的实体 + + + + + 映射优先级,默认: Attribute > FluentApi > Aop + + + + + 实体特性 + [Table(Name = "tabname")] + [Column(Name = "table_id")] + + + + + 流式接口 + fsql.CodeFirst.ConfigEntity(a => a.Name("tabname")) + fsql.CodeFirst.ConfigEntity(a => a.Property(b => b.Id).Name("table_id")) + + + + + AOP 特性 https://github.com/dotnetcore/FreeSql/wiki/AOP + fsql.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = "public.tabname"; + fsql.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = "table_id"; + + + + + 不进行任何处理 + + + + + 将帕斯卡命名字符串转换为下划线分隔字符串 + + BigApple -> Big_Apple + + + + + 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全大写 + + BigApple -> BIG_APPLE + + + + + 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全小写 + + BigApple -> big_apple + + + + + 将字符串转换为大写 + + BigApple -> BIGAPPLE + + + + + 将字符串转换为小写 + + BigApple -> bigapple + + + + + 创建一个过滤器 + 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal + + + 名字 + 表达式 + + + + + 创建一个动态过滤器,当 condition 返回值为 true 时才生效 + 场景:当登陆身份是管理员,则过滤条件不生效 + 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal + + + 名字 + 委托,返回值为 true 时才生效 + 表达式 + + + + + 创建一个过滤器(实体类型 属于指定 TEntity 才会生效) + 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal + + + 名字 + 表达式 + + + + + 创建一个过滤器(实体类型 属于指定 TEntity 才会生效) + 场景:当登陆身份是管理员,则过滤条件不生效 + 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal + + + 名字 + 委托,返回值为 true 时才生效 + 表达式 + + + + + 使用指定 DbConnection 连接执行 + + + + + + + 使用指定 DbTransaction 事务执行 + + + + + + + 增加参数化对象 + + 参数名 + 参数值 + 修改本次创建好的参数化对象,比如将 parameterName 参数修改为 Output 类型 + + + + + 设置执行的命令类型,SQL文本、或存储过程 + + + + + + + 设置命令执行超时(秒) + + + + + + + 分页信息 + + + + + 第几页,从1开始 + + + + + 每页多少 + + + + + 查询的记录数量 + + + + + 当前操作的数据 + + + + + 当前批次 + + + + + 总批次数量 + + + + + 获取 obj.CsName 属性值 MapType 之后的数据库值 + + + + + + + 获取 obj.CsName 属性原始值(不经过 MapType) + + + + + + 设置 obj.CsName 属性值 + + + + + + + 动态过滤条件 + + + + + 属性名:Name + 导航属性:Parent.Name + 多表:b.Name + + + + + 操作符 + + + + + 值 + + + + + Filters 下的逻辑运算符 + + + + + 子过滤条件,它与当前的逻辑关系是 And + 注意:当前 Field 可以留空 + + + + + like + + + + + = + Equal/Equals/Eq 效果相同 + + + + + = + Equal/Equals/Eq 效果相同 + + + + + = + Equal/Equals/Eq 效果相同 + + + + + <> + + + + + > + + + + + >= + + + + + < + + + + + <= + + + + + >= and < + 此时 Value 的值格式为逗号分割:value1,value2 或者数组 + + + + + >= and < + 此时 Value 的值格式为逗号分割:date1,date2 或者数组 + 这是专门为日期范围查询定制的操作符,它会处理 date2 + 1,比如: + 当 date2 选择的是 2020-05-30,那查询的时候是 < 2020-05-31 + 当 date2 选择的是 2020-05,那查询的时候是 < 2020-06 + 当 date2 选择的是 2020,那查询的时候是 < 2021 + 当 date2 选择的是 2020-05-30 12,那查询的时候是 < 2020-05-30 13 + 当 date2 选择的是 2020-05-30 12:30,那查询的时候是 < 2020-05-30 12:31 + 并且 date2 只支持以上 5 种格式 (date1 没有限制) + + + + + in (1,2,3) + 此时 Value 的值格式为逗号分割:value1,value2,value3... 或者数组 + + + + + not in (1,2,3) + 此时 Value 的值格式为逗号分割:value1,value2,value3... 或者数组 + + + + + 自定义解析,此时 Field 为反射信息,Value 为静态方法的参数(string/Expression) + 示范:{ Operator: "Custom", Field: "RawSql webapp1.DynamicFilterCustom,webapp1", Value: "(id,name) in ((1,'k'),(2,'m'))" } + 注意:使用者自己承担【注入风险】 + 静态方法定义示范: + namespace webapp1 + { + public class DynamicFilterCustom + { + [DynamicFilterCustom] + public static string RawSql(object sender, string value) => value; + } + } + + + + + 授权 DynamicFilter 支持 Custom 自定义解析 + + + + + 是否放弃继续读取 + + + + + 中间表,多对多 + + + + + PostgreSQL 数组类型专属功能 + 方式一:select * from Role where Id in (RoleIds) + class User { + ____public int[] RoleIds { get; set; } + ____[Navigate(nameof(RoleIds))] + ____public List<Role> Roles { get; set; } + } + 方式二:select * from User where RoleIds @> Id + class Role { + ____public int Id { get; set; } + ____[Navigate(nameof(User.RoleIds))] + ____public List<User> Users { get; set; } + } + + + + + 是否可用 + + + + + 不可用错误 + + + + + 不可用时间 + + + + + 将对象池设置为不可用,后续 Get/GetAsync 均会报错,同时启动后台定时检查服务恢复可用 + + + + 由【可用】变成【不可用】时返回true,否则返回false + + + + 统计对象池中的对象 + + + + + 统计对象池中的对象(完整) + + + + + 获取资源 + + 超时 + + + + + 使用完毕后,归还资源 + + 对象 + 是否重新创建 + + + + 名称 + + + + + 池容量 + + + + + 默认获取超时设置 + + + + + 空闲时间,获取时若超出,则重新创建 + + + + + 异步获取排队队列大小,小于等于0不生效 + + + + + 获取超时后,是否抛出异常 + + + + + 监听 AppDomain.CurrentDomain.ProcessExit/Console.CancelKeyPress 事件自动释放 + + + + + 后台定时检查可用性间隔秒数 + + + + + 权重 + + + + + 对象池的对象被创建时 + + 返回被创建的对象 + + + + 销毁对象 + + 资源对象 + + + + 从对象池获取对象超时的时候触发,通过该方法统计 + + + + + 从对象池获取对象成功的时候触发,通过该方法统计或初始化对象 + + 资源对象 + + + + 归还对象给对象池的时候触发 + + 资源对象 + + + + 检查可用性 + + 资源对象 + + + + + 事件:可用时触发 + + + + + 事件:不可用时触发 + + + + + 所属对象池 + + + + + 在对象池中的唯一标识 + + + + + 资源对象 + + + + + 被获取的总次数 + + + + 最后获取时的时间 + + + + 最后归还时的时间 + + + + + 创建时间 + + + + + 最后获取时的线程id + + + + + 最后归还时的线程id + + + + + 重置 Value 值 + + + + + 对象池管理类 + + 对象类型 + + + + 后台定时检查可用性 + + + + + + 创建对象池 + + 池大小 + 池内对象的创建委托 + 获取池内对象成功后,进行使用前操作 + + + + 创建对象池 + + 策略 + + + + 获取可用资源,或创建资源 + + + + + + + String resources used in FreeSql exceptions, etc. + + + These strings are exposed publicly for use by database providers and extensions. + It is unusual for application code to need these strings. + + + + + + 重写当前线程的 CurrentUICulture 属性,对 + 使用此强类型资源类的所有资源查找执行重写。 + + + + + [Table(AsTable = "{asTable}")] 特性值格式错误 + + + + + [Table(AsTable = xx)] 设置的属性名 {atmGroupsValue} 不是 DateTime 类型 + + + + + {name}: Failed to get resource {statistics} + + + + + {name}: An exception needs to be thrown + + + + + 错误的表达式格式 {column} + + + + + Chunk 功能之前不可使用 Select + + + + + 安全起见,请务必在事务开启之后,再使用 ForUpdate + + + + + 不能为 null + + + + + {name} 不能为 null + + + + + 无法匹配 {property} + + + + + {property} 无法解析为表达式树 + + + + + 参数 masterConnectionString 不可为空,请检查 UseConnectionString + + + + + 提交 + + + + + 连接失败,准备切换其他可用服务器 + + + + + 自定义表达式解析错误:类型 {exp3MethodDeclaringType} 需要定义 static ThreadLocal<ExpressionCallContext> 字段、字段、字段(重要三次提醒) + + + + + Custom { 反射信息 }不能为空,格式:{ 静态方法名 }{ 空格 }{ 反射信息 } + + + + + Custom { 静态方法名 }不能为空,格式:{ 静态方法名 }{ 空格 }{ 反射信息 } + + + + + Custom 对应的{{ 静态方法名 }}:{fiValueCustomArray} 未设置 [DynamicFilterCustomAttribute] 特性 + + + + + Custom 要求 Field 应该空格分割,并且长度为 2,格式:{ 静态方法名 }{ 空格 }{ 反射信息 } + + + + + 操作的数据类型({dataDisplayCsharp}) 与 AsType({tableTypeDisplayCsharp}) 不一致,请检查。 + + + + + DateRange 要求 Value 应该逗号分割,并且长度为 2 + + + + + DateRange 要求 Value[1] 格式必须为:yyyy、yyyy-MM、yyyy-MM-dd、yyyy-MM-dd HH、yyyy、yyyy-MM-dd HH:mm + + + + + 记录可能不存在,或者【行级乐观锁】版本过旧,更新数量{sourceCount},影响的行数{affrows}。 + + + + + SlaveConnectionString 数量与 SlaveWeights 不相同 + + + + + ColumnAttribute.Name {colattrName} 重复存在,请检查(注意:不区分大小写) + + + + + 属性名 {pName} 重复存在,请检查(注意:不区分大小写) + + + + + {function} 功能要求实体类 {tableCsName} 必须有主键 + + + + + {tbTypeFullName} 是父子关系,但是 MySql 8.0 以下版本中不支持组合多主键 + + + + + {tbTypeFullName} 不是父子关系,无法使用该功能 + + + + + 这个特别的子查询不能解析 + + + + + 表达式错误,它的顶级对象不是 ParameterExpression:{exp} + + + + + 表达式错误,它不是连续的 MemberAccess 类型:{exp} + + + + + ExpressionTree 转换类型错误,值({value}),类型({valueTypeFullName}),目标类型({typeFullName}),{exMessage} + + + + + 未能解析分表字段值 {sqlWhere} + + + + + AsTable 未实现的功能 {asTable} + + + + + GBase 暂时不支持逗号以外的分割符 + + + + + tableName:{tableName} 生成了相同的分表名 + + + + + GetPrimarys 传递的参数 "{primary}" 不正确,它不属于字典数据的键名 + + + + + 已经指定了 {first},不能再指定 {second} + + + + + {tb2DbName}.{mp2MemberName} 被忽略,请检查 IsIgnore 设置,确认 get/set 为 public + + + + + Include 参数类型错误 + + + + + Include 参数类型错误,集合属性请使用 IncludeMany + + + + + Include 参数类型错误,表达式类型应该为 MemberAccess + + + + + IncludeMany 类型 {tbTypeDisplayCsharp} 的属性 {collMemMemberName} 不是有效的导航属性,提示:IsIgnore = true 不会成为导航属性 + + + + + IncludeMany {navigateSelector} 参数错误,Select 只可以使用一个参数的方法,正确格式:.Select(t =>new TNavigate {{}}) + + + + + IncludeMany {navigateSelector} 参数错误,Select lambda参数返回值必须和 {collMemElementType} 类型一致 + + + + + IncludeMany 参数1 类型错误,表达式类型应该为 MemberAccess + + + + + IncludeMany {navigateSelector} 参数类型错误,正确格式: a.collections.Take(1).Where(c =>c.aid == a.id).Select(a=> new TNavigate{{}}) + + + + + ISelect.InsertInto() 未选择属性: {displayCsharp} + + + + + ISelect.InsertInto() 类型错误: {displayCsharp} + + + + + InsertOrUpdate 功能执行 merge into 要求实体类 {CsName} 必须有主键 + + + + + InsertOrUpdate<>的泛型参数 不支持 {typeofT1},请传递您的实体类 + + + + + 【延时加载】功能需要安装 FreeSql.Extensions.LazyLoading.dll,可前往 nuget 下载 + + + + + 【延时加载】{trytbTypeName} 编译错误:{exMessage}\r\n\r\n{cscode} + + + + + 【延时加载】实体类型 {trytbTypeName} 必须声明为 public + + + + + ManyToMany 导航属性 .AsSelect() 暂时不可用于 Sum/Avg/Max/Min/First/ToOne/ToList 方法 + + + + + 【ManyToMany】导航属性 {trytbTypeName}.{pnvName} 在 {tbmidCsName} 中没有找到对应的字段,如:{midTypePropsTrytbName}{findtrytbPkCsName}、{midTypePropsTrytbName}_{findtrytbPkCsName} + + + + + 【ManyToMany】导航属性 {trytbTypeName}.{pnvName} 解析错误,实体类型 {tbrefTypeName} 缺少主键标识,[Column(IsPrimary = true)] + + + + + 【ManyToMany】导航属性 {trytbTypeName}.{pnvName} 解析错误,实体类型 {tbrefTypeName} 必须存在对应的 [Navigate(ManyToMany = x)] 集合属性 + + + + + 【ManyToMany】导航属性 {trytbTypeName}.{pnvName} 解析错误,{tbmidCsName}.{trycolCsName} 和 {trytbCsName}.{trytbPrimarysCsName} 类型不一致 + + + + + 【ManyToMany】导航属性 {trytbTypeName}.{pnvName} 解析错误,中间类 {tbmidCsName}.{midTypePropsTrytbName} 错误:{exMessage} + + + + + 【ManyToMany】导航属性 {trytbTypeName}.{pnvName} 解析错误,中间类 {tbmidCsName}.{midTypePropsTrytbName} 导航属性不是【ManyToOne】或【OneToOne】 + + + + + 映射异常:{name} 没有一个属性名相同 + + + + + Ado.MasterPool 值为 null,该操作无法自启用事务,请显式传递【事务对象】解决 + + + + + 缺少 FreeSql 数据库实现包:FreeSql.Provider.{Provider}.dll,可前往 nuget 下载 + + + + + 缺少 FreeSql 数据库实现包:{dll},可前往 nuget 下载;如果存在 {dll} 依然报错(原因是环境问题导致反射不到类型),请在 UseConnectionString/UseConnectionFactory 第三个参数手工传入 typeof({providerType}) + + + + + 导航属性 {trytbTypeName}.{pnvName} 特性 [Navigate] Bind 数目({bindColumnsCount}) 与 外部主键数目({tbrefPrimarysLength}) 不相同 + + + + + {tb2DbName}.{mp2MemberName} 导航属性集合忘了 .AsSelect() 吗?如果在 ToList(a => a.{mp2MemberName}) 中使用,请移步参考 IncludeMany 文档。 + + + + + 【导航属性】{trytbTypeDisplayCsharp}.{pName} 缺少 set 属性 + + + + + 导航属性 {trytbTypeName}.{pnvName} 没有找到对应的字段,如:{pnvName}{findtbrefPkCsName}、{pnvName}_{findtbrefPkCsName}。或者使用 [Navigate] 特性指定关系映射。 + + + + + 导航属性 {trytbTypeName}.{pnvName} 解析错误,实体类型 {trytcTypeName} 缺少主键标识,[Column(IsPrimary = true)] + + + + + 导航属性 {trytbTypeName}.{pnvName} 解析错误,{trytbCsName}.{trycolCsName} 和 {tbrefCsName}.{tbrefPrimarysCsName} 类型不一致 + + + + + 导航属性 {trytbTypeName}.{pnvName} 特性 [Navigate] 解析错误,在 {tbrefTypeName} 未找到属性:{bi} + + + + + {tableTypeDisplayCsharp} 没有定义主键,无法使用 SetSource,请尝试 SetDto 或者 SetSource 指定临时主键 + + + + + 没有定义属性 + + + + + 未实现 + + + + + 未实现函数表达式 {exp} 解析 + + + + + 未实现函数表达式 {exp} 解析,参数 {expArguments} 必须为常量 + + + + + 未实现函数表达式 {exp} 解析,如果正在操作导航属性集合,请使用 .AsSelect().{exp3MethodName}({exp3ArgumentsCount}) + + + + + 未实现 MemberAccess 下的 Constant + + + + + 未实现 {name} + + + + + 不支持 + + + + + {dataType} 不支持 OrderByRandom 随机排序 + + + + + {property} 不是有效的导航属性 + + + + + {dbName} 找不到列 {memberName} + + + + + 找不到 {CsName} 对应的列 + + + + + 找不到属性:{memberName} + + + + + 找不到属性名 {proto} + + + + + Custom 找不到对应的{{ 反射信息 }}:{fiValueCustomArray} + + + + + Custom 找不到对应的{{ 静态方法名 }}:{fiValueCustomArray} + + + + + [Table(AsTable = xx)] 设置的属性名 {atmGroupsValue} 不存在 + + + + + 未指定 UseConnectionString 或者 UseConnectionFactory + + + + + 【{policyName}】ObjectPool.{GetName}() timeout {totalSeconds} seconds, see: https://github.com/dotnetcore/FreeSql/discussions/1081 + + + + + 【{policyName}】ObjectPool.GetAsync() The queue is too long. Policy.AsyncGetCapacity = {asyncGetCapacity} + + + + + 【OneToMany】导航属性 {trytbTypeName}.{pnvName} 在 {tbrefCsName} 中没有找到对应的字段,如:{findtrytb}{findtrytbPkCsName}、{findtrytb}_{findtrytbPkCsName} + + + + + 【OneToMany】导航属性 {trytbTypeName}.{pnvName} 解析错误,{trytbCsName}.{trytbPrimarysCsName} 和 {tbrefCsName}.{trycolCsName} 类型不一致 + + + + + 、{refpropName}{findtrytbPkCsName}、{refpropName}_{findtrytbPkCsName}。或者使用 [Navigate] 特性指定关系映射。 + + + + + 参数 field 未指定 + + + + + {property} 参数错误,它不是集合属性,必须为 IList<T> 或者 ICollection<T> + + + + + {property} 参数错误,它不是有效的导航属性 + + + + + {where} 参数错误,{keyval} 不是有效的属性名,在实体类 {reftbTypeDisplayCsharp} 无法找到 + + + + + {property} 参数错误,格式 "TopicId=Id,多组使用逗号连接" + + + + + 解析失败 {callExpMethodName} {message} + + + + + 【{policyName}】The ObjectPool has been disposed, see: https://github.com/dotnetcore/FreeSql/discussions/1079 + + + + + 【{policyName}】状态不可用,等待后台检查程序恢复方可使用。{UnavailableExceptionMessage} + + + + + 属性{trytbVersionColumnCsName} 被标注为行锁(乐观锁)(IsVersion),但其必须为数字类型 或者 byte[] 或者 string,并且不可为 Nullable + + + + + properties 参数不能为空 + + + + + {property} 属性名无法找到 + + + + + Range 要求 Value 应该逗号分割,并且长度为 2 + + + + + 回滚 + + + + + 运行时错误,反射获取 IncludeMany 方法失败 + + + + + 蛋疼的 Access 插入只能一条一条执行,不支持 values(..),(..) 也不支持 select .. UNION ALL select .. + + + + + BaseEntity.Initialization 初始化错误,获取到 IFreeSql 是 null + + + + + 【{thisName}】Block access and wait for recovery: {exMessage} + + + + + 无法将 IQueryable<{typeofName}> 转换为 ISelect<{typeofName}>,因为他的实现不是 FreeSql.Extensions.Linq.QueryableProvider + + + + + 连接字符串错误 + + + + + 【{thisName}】连接字符串错误,请检查。 + + + + + 连接字符串错误,或者检查项目属性 > 生成 > 目标平台:x86 | x64,或者改用 FreeSql.Provider.SqliteCore 访问 arm 平台 + + + + + 【{thisName}】连接字符串错误,请检查。或者检查项目属性 > 生成 > 目标平台:x86 | x64,或者改用 FreeSql.Provider.SqliteCore 访问 arm 平台 + + + + + FreeSql.Provider.CustomAdapter 无法使用 CreateCommand + + + + + FreeSql.Provider.CustomAdapter 仅支持 UseConnectionFactory 方式构建 IFreeSql + + + + + 达梦 CodeFirst 不支持代码创建 tablespace 与 schemas {tbname} + + + + + -DB 参数错误,未提供 ConnectionString + + + + + -DB 参数错误,格式为:MySql,ConnectionString + + + + + -DB 参数错误,不支持的类型:"{dbargs}" + + + + + {method} 是 FreeSql.Provider.{provider} 特有的功能 + + + + + fsql.InsertOrUpdate Sqlite 无法完成 UpdateColumns 操作 + + + + + 主库 + + + + + MygisGeometry.Parse 未实现 "{wkt}" + + + + + -NameOptions 参数错误,格式为:0,0,0,0 + + + + + 未实现该功能 + + + + + 未实现错误,请反馈给作者 + + + + + 找不到 {name} + + + + + FreeSql.Provider.{providerName} 未实现 Skip/Offset 功能,如果需要分页请使用判断上一次 id + + + + + 对象池 + + + + + 旧表(OldName):{tboldname} 存在,数据库已存在 {tbname} 表,无法改名 + + + + + OnConflictDoUpdate 功能要求实体类必须设置 IsPrimary 属性 + + + + + Oracle CodeFirst 不支持代码创建 tablespace 与 schemas {tbname} + + + + + 解析失败 {callExpMethodName} {message},提示:可以使用扩展方法 IQueryable.RestoreToSelect() 还原为 ISelect 再查询 + + + + + fsql.InsertOrUpdate + IfExistsDoNothing + {providerName}要求实体类 {tableCsName} 必须有主键 + + + + + SelectMany 错误的类型:{typeFullName} + + + + + 从库 + + + + + 类型 {objentityTypeFullName} 不可迁移 + + + + + 类型 {objentityTypeFullName} 不可迁移,可迁移属性0个 + + + + + 未实现 {columnDbTypeTextFull} 类型映射 + + + + + 错误的参数设置:{args} + + + + + {qoteSql} is NULL,除非设置特性 [Column(IsNullable = false)] + + + + + 分表字段值 "{dt}" 不能小于 "{beginTime} " + + + + + 分表字段值不能为 null + + + + + 分表字段值 "{columnValue}" 不能转化成 DateTime + + + + + 分表字段值 "{dt}" 未匹配到分表名 + + + + + T2 类型错误 + + + + + tableName 格式错误,示例:“log_{yyyyMMdd}” + + + + + {Type}.AsType 参数错误,请传入正确的实体类型 + + + + + {thatFullName} 类型无法访问构造函数 + + + + + {name} 类型错误 + + + + + {Type}.AsType 参数不支持指定为 object + + + + + 类型 {typeofFullName} 错误,不能使用 IncludeMany + + + + + 无法解析表达式:{exp} + + + + + 无法解析表达式方法 {exp3tmpCallMethodName} + + + + + 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + + + C#: that >= between && that <= and + SQL: that BETWEEN between AND and + + + + + + + + + 注意:这个方法和 Between 有细微区别 + C#: that >= start && that < end + SQL: that >= start and that < end + + + + + + + + + 获取 Type 的原始 c# 文本表示 + + + + + + + + 测量两个经纬度的距离,返回单位:米 + + 经纬坐标1 + 经纬坐标2 + 返回距离(单位:米) + + + + 将 IEnumable<T> 转成 ISelect<T>,以便使用 FreeSql 的查询功能。此方法用于 Lambda 表达式中,快速进行集合导航的查询。 + + + + + + + + 多表查询 + + + + + + 本方法实现从已知的内存 List 数据,进行和 ISelect.IncludeMany 相同功能的贪婪加载 + 示例:new List<Song>(new[] { song1, song2, song3 }).IncludeMany(fsql, a => a.Tags); + 文档:https://github.com/dotnetcore/FreeSql/wiki/%E8%B4%AA%E5%A9%AA%E5%8A%A0%E8%BD%BD + + + + + + 选择一个集合的导航属性,如: .IncludeMany(a => a.Tags) + 可以 .Where 设置临时的关系映射,如: .IncludeMany(a => a.Tags.Where(tag => tag.TypeId == a.Id)) + 可以 .Take(5) 每个子集合只取5条,如: .IncludeMany(a => a.Tags.Take(5)) + 可以 .Select 设置只查询部分字段,如: (a => new TNavigate { Title = a.Title }) + + 即能 ThenInclude,还可以二次过滤(这个 EFCore 做不到?) + + + + + 本方法实现从已知的内存 List 数据,进行和 ISelect.IncludeMany/Include 相同功能的贪婪加载 + 集合:new List<Song>(new[] { song1, song2, song3 }).IncludeByPropertyName(fsql, "Tags", "ParentId=Id", 5, "Id,Name"); + 普通:new List<Song>(new[] { song1, song2, song3 }).IncludeByPropertyName(fsql, "Catetory"); + ---普通属性 where/take/select 参数将无效 + 文档:https://github.com/dotnetcore/FreeSql/wiki/%E8%B4%AA%E5%A9%AA%E5%8A%A0%E8%BD%BD + + + + + 选择一个集合或普通属性 + 设置临时的子集合关系映射,格式:子类属性=T1属性,多组以逗号分割 + 设置子集合只取条数 + 设置子集合只查询部分字段 + + + + + + 查询数据,加工为树型 List 返回 + 注意:实体需要配置父子导航属性 + + + + + + + + 使用递归 CTE 查询树型的所有子记录,或者所有父记录。 + 通过测试的数据库:MySql8.0、SqlServer、PostgreSQL、Oracle、Sqlite、Firebird、达梦、人大金仓、翰高 + 返回隐藏字段:.ToList(a => new { item = a, level = "a.cte_level", path = "a.cte_path" }) + * v2.0.0 兼容 MySql5.6 向上或向下查询,但不支持 pathSelector/pathSeparator 详细:https://github.com/dotnetcore/FreeSql/issues/536 + + + + false(默认):由父级向子级的递归查询true:由子级向父级的递归查询 + 路径内容选择 + 连接路径内容 + 递归层级 + + + + + 随机排序 + 支持:MySql/SqlServer/PostgreSQL/Oracle/Sqlite/Firebird/达梦/金仓/神通 + 不支持:MsAcess + + + + + + 插入数据字典 Dictionary<string, object> + + + + + + + 插入数据字典,传入 Dictionary<string, object> 集合 + + + + + + + 更新数据字典 Dictionary<string, object> + + + + + + + 更新数据字典,传入 Dictionary<string, object> 集合 + + + + + + + 插入或更新数据字典,此功能依赖数据库特性(低版本可能不支持),参考如下: + 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:不支持 + + + + + + + 删除数据字典 Dictionary<string, object> + + + + + + + 删除数据字典,传入 Dictionary<string, object> 集合 + + + + + + + 使用 and 拼接两个 lambda 表达式 + + + + + + 使用 and 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 将 lambda 表达式取反 + + + true 时生效 + + + + + 使用 and 拼接两个 lambda 表达式 + + + + + + 使用 and 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 将 lambda 表达式取反 + + + true 时生效 + + + + + 使用 and 拼接两个 lambda 表达式 + + + + + + 使用 and 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 将 lambda 表达式取反 + + + true 时生效 + + + + + 使用 and 拼接两个 lambda 表达式 + + + + + + 使用 and 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + + + + 使用 or 拼接两个 lambda 表达式 + + + true 时生效 + + + + + + 将 lambda 表达式取反 + + + true 时生效 + + + + + 使用 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 条件 + + + + +em.Boolean,System.Linq.Expressions.Expression{System.Func{``0,``1,``2,``3,``4,System.Boolean}})"> + + 使用 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/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index f84e3ead..5e3432c2 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index 75ab944c..8f7e4fe8 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index 93ba2532..8894cad3 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index 499c9af5..44bfae6f 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 20c4105b..617fea34 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index de56bd89..b6d1c25c 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index b8b9bf23..a35622ea 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index b49cbfcb..643ff7b9 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 833df370..ac265e94 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index 1b2f0f52..033bad42 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 0e87a15d..e05f03bb 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index 29d9a9da..4280b2d0 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index 9040d735..1b9b87a9 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index a0ab7a5d..23cd2064 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index 8e7a6f97..68e10d7f 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 0dd97341..bb9b16fc 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -18,7 +18,7 @@ true false key.snk - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 3eecf135..737adebd 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index d79af693..6609d420 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305 diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index ec20ddc8..c302bfe8 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.691-preview20230303 + 3.2.691-preview20230305