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()")]
或者:[Column(RereadSql = "{geo}.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()")]
或者:[Column(RereadSql = "{geo}.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
是否唯一
索引类型
暂时只有 FreeSql.Provider.PostgreSQL 有效
暂时只有 FreeSql.Provider.PostgreSQL 有效
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 同步结构迁移
格式:属性名=开始时间(递增)
按年分表:[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)")]
导航关系Fluent,与 NavigateAttribute 对应
多对多关系的中间实体类型
设置实体的索引
索引名
索引字段,为属性名以逗号分隔,如:Create_time ASC, Title ASC
是否唯一
数据库表名
指定数据库旧的表名,修改实体命名时,同时设置此参数为修改之前的值,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)")]
导航关系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}
主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合
多表查询
多表查询
多表查询
多表查询
多表查询
多表查询
多表查询
多表查询
多表查询
获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 ""
当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)
注意:使用者自己承担【注入风险】
大于 >
大于或等于 >=
小于 <
小于或等于 <=
value1 IS NULL
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<>)
用于指定自定义实现TableEntiy 的缓存集合
解决多实例下相同类型映射到不同表的问题
使用原始连接池(ado.net、odbc、oledb)
默认:false
UseConnectionString 默认使用 FreeSql 连接池,有以下特点:
- 状态不可用,断熔机制直到后台检测恢复
- 读写分离,从库不可用,会切换其他可用从库
- 监测连接池使用情况,fsql.Ado.Statistics
有部分使用者不喜欢【断熔机制】,可使用此设置
使用从数据库,支持多个
从数据库连接串
使用自定义数据库连接对象(放弃内置对象连接池技术)
数据库类型
数据库连接对象创建器
提供者的类型,一般不需要指定,如果一直提示“缺少 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选择列
忽略的列
属性名,或者字段名
忽略 InsertValueSql 设置,将使用实体对象的值插入
IgnoreInsertValueSql(a => a.Name) | IgnoreInsertValueSql(a => new{a.Name,a.Time}) | IgnoreInsertValueSql(a => new[]{"name","time"})
属性名,或者字段名
指定可插入自增字段
不使用参数化,可通过 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选择列
当记录存在时,指定只更新的字段
属性名,或者字段名
设置列的联表值,格式:
UpdateSet((a, b) => a.Clicks == b.xxx)
UpdateSet((a, b) => a.Clicks == a.Clicks + 1)
批量执行选项设置,一般不需要使用该方法
各数据库 rows 限制不一样,默认设置:200
若没有事务传入,内部(默认)会自动开启新事务,保证拆包执行的完整性。
指定根据 rows 上限数量拆分执行
是否自动开启事务
设置表名规则,可用于分库/分表,参数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形式返回
返回的变量
分组的数据
记录总数
求和
平均值
最大值
最小值
所有元素
联表更新(危险操作),支持更复杂的联表更新
fsql.Update<T1>()
.Join(fsql.Select<T1>(), (a, b) => a.id == b.id)
.Set((a, b) => a.name == b.name)
.Set((a, b) => a.time == b.time2)
.ExecuteAffrows();
联表更新(危险操作)
fsql.Update<T1>()
.Join<T2>((a, b) => a.id == b.id)
.Set((a, b) => a.name == b.name)
.Set((a, b) => a.time == b.time2)
.ExecuteAffrows();
指定事务对象
指定事务对象
命令超时设置(秒)
不使用参数化,可通过 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)] 的属性不会被更新
注意:SetDto 与 IUpdate.IgnoreColumns/UpdateColumns 不能同时使用
dto 或 Dictionary<string, object>
设置更新的列
SetDto(new { title = "xxx", clicks = 2 })
SetDto(new Dictionary<string, object> { ["title"] = "xxx", ["clicks"] = 2 })
注意:标记 [Column(CanUpdate = false)] 的属性不会被更新
注意:SetDto 与 IUpdate.IgnoreColumns/UpdateColumns 不能同时使用
dto 或 Dictionary<string, object>
属性值忽略判断, true忽略
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 有效果
执行SQL语句,返回更新后的记录
注意:此方法只有 Postgresql/SqlServer 有效果
指定事务对象
指定事务对象
命令超时设置(秒)
设置列的固定新值,Set(a => a.Name, "newvalue")
lambda选择列
新值
设置列的固定新值,Set(a => a.Name, "newvalue")
true 时生效
lambda选择列
新值
设置列的联表值,格式:
Set((a, b) => a.Clicks == b.xxx)
Set((a, b) => a.Clicks == a.Clicks + 1)
设置列的联表值,格式:
Set((a, b) => a.Clicks == b.xxx)
Set((a, b) => a.Clicks == a.Clicks + 1)
true 时生效
设置值,自定义SQL语法,SetRaw("title = @title", new { title = "newtitle" })
提示:parms 参数还可以传 Dictionary<string, object>
sql语法
参数
lambda表达式条件,仅支持实体基础成员(不包含导航对象)
lambda表达式条件
lambda表达式条件,仅支持实体基础成员(不包含导航对象)
true 时生效
lambda表达式条件
原生sql语法条件,Where("id = @id", new { id = 1 })
提示:parms 参数还可以传 Dictionary<string, object>
sql语法条件
参数
禁用全局过滤功能,不传参数时将禁用所有
零个或多个过滤器名字
设置表名
返回即将执行的SQL语句
执行SQL语句,返回影响的行数
主库连接池
从库连接池
数据库类型
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 位置
DataReader 对应的 PropertyInfo
获取 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 条件
插入数据,传入实体集合
插入数据,传入实体集合
插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下:
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 条件