diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 84f9b52fa..caf53fc2e 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -30,14 +30,6 @@ - - - Select1Provider2`16.tt - True - True - - - TextTemplatingFileGenerator diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index fd4c68beb..d81cee4b2 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2088,71 +2088,85 @@ - + - 将查询转为删除对象,以便支持导航对象或其他查询功能删除数据,如下: - 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 默认只支持简单的操作); + 审核或跟踪 ToList 即将返回的数据 + - + - 设置表名规则,可用于分库/分表,参数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() + 执行SQL查询,返回 DataTable - - + - 设置别名规则,可用于拦截表别名,实现类似 sqlserver 的 with(nolock) 需求 - 如:select.AsAlias((_, old) => $"{old} with(lock)") + 执行SQL查询,返回 properties 指定的实体类属性,并以 DataTable 接收 - + 属性名:Name导航属性:Parent.Name多表:b.Name - + - 动态Type,在使用 Select<object> 后使用本方法,指定实体类型 + 以字典的形式返回查询结果 + 注意:字典的特点会导致返回的数据无序 - + + - + - 返回即将执行的SQL语句 + 执行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查询,是否有记录 + 执行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 实体所有字段的第 查询的记录数量 @@ -2799,6 +2813,87 @@ + + + 按聚合条件过滤,Having(a => a.Count() > 10) + + lambda表达式 + 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) @@ -3063,89 +3158,6 @@ 实体 - - - 更新数据,设置更新的实体集合 - 注意:实体必须定义主键,并且最终会自动附加条件 where id in (source.Id) - - 实体集合 - 根据临时主键更新,a => a.Name | a => new{a.Name,a.Time} | a => new[]{"name","time"} - 忽略 IsVersion 乐观> - - - - - - 联表更新(危险操作) - 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 - - 实体 - - 更新数据,设置更新的实体集合 @@ -3474,108 +3486,91 @@ - 禁用全局过滤功能,不传参数时将禁用所有 + 禁用全局过滤功能,不传参【主库】 - 零个或多个过滤器名字 - + + + + - + - 设置表名 + 查询,ExecuteReader(dr => {}, "select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> - - - + + + - + - 返回即将执行的SQL语句 + 查询 - + + + - + - 执行SQL语句,返回影响的行数 + 查询,ExecuteArray("select * from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> + + - - - 主库连接池 - - - - - 从库连接池 - - - - - 数据库类型 - - - - - UseConnectionString 时候的值 - - - - - UseSalve 时候的值 - - - + - 唯一标识 + 查询 + + + - + - 开启事务(不支持异步) + 查询,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> + + + - + - 将 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 + 在【主库】执行,ExecuteNonQuery("delete from user where age > @age", new { age = 25 }) + 提示:parms 参数还可以传 Dictionary<string, object> - - - 测试数据库是否连接正确,本方法执行如下命令: - MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1 - Oracle: SELECT 1 FROM dual - - 命令超时设置(秒) + 命令超时设置(秒) true: 成功, false: 失败 @@ -3982,313 +3977,381 @@ 实体配置 - - - + t.GetTablesByDatabase(System.String[])"> - 索引配置 - - - - - 实体类型 - - - - - 实体的属性 + 获取指定数据库的表信息,包括表、列详情、主键、唯一键、索引、外键、备注 + + - + - 实体的属性配置 + 获取指定单表信息,包括列详情、主键、唯一键、索引、备注 + 表名,如:dbo.table1 + 是否忽略大小写 + - + - 标识符,可将 CurdBefore 与 CurdAfter 进行匹配 + 判断表是否存在 + 表名,如:dbo.table1 + 是否忽略大小写 + - + - 操作类型 + 获取数据库枚举类型int值 + + - + - 实体类型 + 获取c#转换,(int)、(long) + + - + - 实体类型的元数据 + 获取c#值 + + - + - 执行的 SQL + 获取c#类型,int、long + + - + - 参数化命令 + 获取c#类型对象 + + - + - 状态数据,可与 CurdAfter 共享 + 获取ado.net读取方法, GetBoolean、GetInt64 + + - + - 发生的错误 + 序列化 + + - + - 执行SQL命令,返回的结果 + 反序列化 + + - + - 耗时(单位:Ticks) + 获取数据库枚举类型,适用 PostgreSQL + + - + - 耗时(单位:毫秒) + 临时 LambdaExpression.Parameter - + - 标识符,可将 SyncStructureBeforeEventArgs 与 SyncStructureAfterEventArgs 进行匹配 + 如果实体类有自增属性,分成两个 List,有值的Item1 merge,无值的Item2 insert + + - + - 实体类型 + AsType, Ctor, ClearData 三处地方需要重新加载 - + - 状态数据,可与 SyncStructureAfter 共享 + AsType, Ctor, ClearData 三处地方需要重新加载 - + - 执行的 SQL + 动态读取 DescriptionAttribute 注释文本 + + - + - 发生的错误 + 通过属性的注释文本,通过 xml 读取 + + Dict:key=属性名,value=注释 - + - 耗时(单位:Ticks) + 更新实体的元数据 - + - 耗时(单位:毫秒) + 执行更新的 SQL - + - 类型 + 执行更新命令的参数 - + - 属性列的元数据 + 执行更新命令影响的行 - + - 反射的属性信息 + 更新的实体数量 - + - 获取实体的属性值,也可以设置实体的属性新值 + 更新的实体 - + - 实体对象 + 映射优先级,默认: Attribute > FluentApi > Aop - + - 中断实体对象审计 - false: 每个实体对象的属性都会审计(默认) - true: 每个实体对象只审计一次 + 实体特性 + [Table(Name = "tabname")] + [Column(Name = "table_id")] - + - ADO.NET 数据流读取对象 + 流式接口 + fsql.CodeFirst.ConfigEntity(a => a.Name("tabname")) + fsql.CodeFirst.ConfigEntity(a => a.Property(b => b.Id).Name("table_id")) - + - DataReader 对应的 Index 位置 + 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"; - + - DataReader 对应的 PropertyInfo + 不进行任何处理 - + - 获取 Index 对应的值,也可以设置拦截的新值 + 将帕斯卡命名字符串转换为下划线分隔字符串 + + BigApple -> Big_Apple - + - 标识符,可将 CommandBefore 与 CommandAfter 进行匹配 + 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全大写 + + BigApple -> BIG_APPLE - + - 状态数据,可与 CommandAfter 共享 + 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全小写 + + BigApple -> big_apple - + - 发生的错误 + 将字符串转换为大写 + + BigApple -> BIGAPPLE - + - 执行SQL命令,返回的结果 + 将字符串转换为小写 + + BigApple -> bigapple - + - 耗时(单位:Ticks) + 创建一个过滤器 + 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal + + 名字 + 表达式 + 条件在最前面 + - + - 耗时(单位:毫秒) + 创建一个动态过滤器,当 condition 返回值为 true 时才生效 + 场景:当登陆身份是管理员,则过滤条件不生效 + 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal + + 名字 + 委托,返回值为 true 时才生效 + 表达式 + 条件在最前面 + - + - 标识符,可将 TraceBeforeEventArgs 与 TraceAfterEventArgs 进行匹配 + 创建一个过滤器(实体类型 属于指定 TEntity 才会生效) + 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal + + 名字 + 表达式 + 条件在最前面 + - + - 状态数据,可与 TraceAfter 共享 + 创建一个过滤器(实体类型 属于指定 TEntity 才会生效) + 场景:当登陆身份是管理员,则过滤条件不生效 + 提示:在 Lambda 中判断登陆身份,请参考资料 AsyncLocal + + 名字 + 委托,返回值为 true 时才生效 + 表达式 + 条件在最前面 + - + - 备注 + 使用指定 DbConnection 连接执行 + + - + - 发生的错误 + 使用指定 DbTransaction 事务执行 + + - + - 耗时(单位:Ticks) + 增加参数化对象 + 参数名 + 参数值 + 修改本次创建好的参数化对象,比如将 parameterName 参数修改为 Output 类型 + - + - 耗时(单位:毫秒) + 设置执行的命令类型,SQL文本、或存储过程 + + - + - 【开发环境必备】自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改 + 设置命令执行超时(秒) + + - + - 转小写同步结构,适用 PostgreSQL + 分页信息 - + - 转大写同步结构,适用 Oracle/达梦/人大金仓 + 第几页,从1开始 - + - 将数据库的主键、自增、索引设置导入,适用 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语句 + 获取 obj.CsName 属性值 MapType 之后的数据库值 - 实体类型 + - + - 将实体类型与数据库对比,返回DDL语句(指定表名) + 获取 obj.CsName 属性原始值(不经过 MapType) - 实体类型 - 指定表名对比 - + - + - 同步实体类型到数据库 - 注意:生产环境中谨慎使用 + 设置 obj.CsName 属性值 - + + - + - 同步实体类型集合到数据库 - 注意:生产环境中谨慎使用 + 动态过滤条件 - - + - 同步实体类型到数据库(指定表名) - 注意:生产环境中谨慎使用 + 属性名:Name + 导航属性:Parent.Name + 多表:b.Name - + + summary> + + + + 获取c#类型对象 @@ -5795,6 +5858,28 @@ 对象池 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and @@ -6361,126 +6446,3 @@ - - - - - 插入数据,传入实体集合 - - - - - - - - 插入数据,传入实体集合 - - - - - - - - 插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下: - 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 - DuckDB: on conflict do update - 达梦: merge into - 人大金仓:on conflict do update - 神通:merge into - MsAccess:不支持 - 注意区别:FreeSql.Repository 仓储也有 InsertOrUpdate 方法(不依赖数据库特性) - - - - - - - 修改数据 - - - - - - - 修改数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 查询数据 - - - - - - - 查询数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 删除数据 - - - - - - - 删除数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1} - - - 主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合 - - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - 事务体 () => {} - - - - 开启事务(不支持异步) - v1.5.0 关闭了线程事务超时自动提交的机制 - - - 事务体 () => {} - - - - 数据库访问对象 - - - - - 所有拦截方法都在这里 - - - - - CodeFirst 模式开发相关方法 - - - - - DbFirst 模式开发相关方法 - - - - - 全局过滤设置,可默认附加为 Select/Update/Delete 条件 - - - - diff --git a/FreeSql/Interface/Curd/ISelect/ISelect2`16.cs b/FreeSql/Interface/Curd/ISelect/ISelect2`16.cs index 75288be21..0601093ee 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect2`16.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect2`16.cs @@ -1,5 +1,4 @@ - -using FreeSql.Internal.Model; +using FreeSql.Internal.Model; using System; using System.Collections.Generic; using System.Data; @@ -11,12 +10,6 @@ namespace FreeSql { - - - - - - public interface ISelect : ISelect0, T1> where T2 : class { @@ -77,6 +70,7 @@ public interface ISelect : ISelect0, T1> where T2 : clas double Avg(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -112,6 +106,7 @@ public interface ISelect : ISelect0, T1> where T2 : clas double Avg(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -194,6 +189,7 @@ public interface ISelect : ISelect0, T1> where T double Avg(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -229,6 +225,7 @@ public interface ISelect : ISelect0, T1> where T double Avg(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -311,6 +308,7 @@ public interface ISelect : ISelect0, T1> double Avg(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -346,6 +344,7 @@ public interface ISelect : ISelect0, T1> double Avg(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -428,6 +427,7 @@ public interface ISelect : ISelect0(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -463,6 +463,7 @@ public interface ISelect : ISelect0(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -545,6 +546,7 @@ public interface ISelect : ISelect0(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -580,6 +582,7 @@ public interface ISelect : ISelect0(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -662,6 +665,7 @@ public interface ISelect : ISelect0(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -697,6 +701,7 @@ public interface ISelect : ISelect0(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -779,6 +784,7 @@ public interface ISelect : ISelect0(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -814,6 +820,7 @@ public interface ISelect : ISelect0(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -896,6 +903,7 @@ public interface ISelect : ISelect0(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -931,6 +939,7 @@ public interface ISelect : ISelect0(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -1013,6 +1022,7 @@ public interface ISelect : ISelect0(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -1048,6 +1058,7 @@ public interface ISelect : ISelect0(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -1130,6 +1141,7 @@ public interface ISelect : ISelect double Avg(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -1165,6 +1177,7 @@ public interface ISelect : ISelect double Avg(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -1247,6 +1260,7 @@ public interface ISelect : IS double Avg(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -1282,6 +1296,7 @@ public interface ISelect : IS double Avg(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -1364,6 +1379,7 @@ public interface ISelect double Avg(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -1399,6 +1415,7 @@ public interface ISelect double Avg(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -1481,6 +1498,7 @@ public interface ISelect(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -1516,6 +1534,7 @@ public interface ISelect(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -1598,6 +1617,7 @@ public interface ISelect(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -1633,6 +1653,7 @@ public interface ISelect(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -1715,6 +1736,7 @@ public interface ISelect(Expression> column); ISelect LeftJoin(Expression> exp); + ISelect Join(Expression> exp); ISelect InnerJoin(Expression> exp); ISelect RightJoin(Expression> exp); @@ -1750,6 +1772,7 @@ public interface ISelect(Expression, TMember>> column); ISelect LeftJoin(Expression, bool>> exp); + ISelect Join(Expression, bool>> exp); ISelect InnerJoin(Expression, bool>> exp); ISelect RightJoin(Expression, bool>> exp); @@ -1768,6 +1791,4 @@ public interface ISelect ISelect.LeftJoin(Expression> exp) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); } + ISelect ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -304,6 +305,7 @@ ISelect ISelect.LeftJoin(Expression, bool> return (this as ISelect).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -640,6 +642,7 @@ ISelect ISelect.LeftJoin(Expression ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -778,6 +781,7 @@ ISelect ISelect.LeftJoin(Expression).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -1117,6 +1121,7 @@ ISelect ISelect.LeftJoin(Expression ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -1255,6 +1260,7 @@ ISelect ISelect.LeftJoin(Expression).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -1597,6 +1603,7 @@ ISelect ISelect.LeftJoin(Expression ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -1735,6 +1742,7 @@ ISelect ISelect.LeftJoin(Expression).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -2080,6 +2088,7 @@ ISelect ISelect.LeftJoin(Express return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); } + ISelect ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -2218,6 +2227,7 @@ ISelect ISelect.LeftJoin(Express return (this as ISelect).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -2566,6 +2576,7 @@ ISelect ISelect.LeftJoin return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); } + ISelect ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -2704,6 +2715,7 @@ ISelect ISelect.LeftJoin return (this as ISelect).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -3055,6 +3067,7 @@ ISelect ISelect. return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); } + ISelect ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -3193,6 +3206,7 @@ ISelect ISelect. return (this as ISelect).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -3547,6 +3561,7 @@ ISelect ISelect ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -3685,6 +3700,7 @@ ISelect ISelect).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -4042,6 +4058,7 @@ ISelect ISelect ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -4180,6 +4197,7 @@ ISelect ISelect).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -4540,6 +4558,7 @@ ISelect ISelect ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -4678,6 +4697,7 @@ ISelect ISelect).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -5041,6 +5061,7 @@ ISelect ISelect ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -5179,6 +5200,7 @@ ISelect ISelect).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -5545,6 +5567,7 @@ ISelect ISelect ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -5683,6 +5706,7 @@ ISelect ISelect).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -6052,6 +6076,7 @@ ISelect ISelect ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -6190,6 +6215,7 @@ ISelect ISelect).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -6562,6 +6588,7 @@ ISelect ISelec return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); } + ISelect ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -6700,6 +6727,7 @@ ISelect ISelec return (this as ISelect).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -7075,6 +7103,7 @@ ISelect I return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); } + ISelect ISelect.Join(Expression> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -7213,6 +7242,7 @@ ISelect I return (this as ISelect).LeftJoin((Expression>)expModify); } + ISelect ISelect.Join(Expression, bool>> exp) => (this as ISelect).InnerJoin(exp); ISelect ISelect.InnerJoin(Expression, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); @@ -7391,5 +7421,3 @@ async Task ISelect> : ISelect0>, T1> <#= double Avg(Expression, TMember>> column); ISelect<<#=NewStr #>> LeftJoin(Expression, bool>> exp); + ISelect<<#=NewStr #>> Join(Expression, bool>> exp); ISelect<<#=NewStr #>> InnerJoin(Expression, bool>> exp); ISelect<<#=NewStr #>> RightJoin(Expression, bool>> exp); @@ -141,6 +142,7 @@ public interface ISelect<<#=NewStr #>> : ISelect0>, T1> <#= double Avg(Expression>, TMember>> column); ISelect<<#=NewStr #>> LeftJoin(Expression>, bool>> exp); + ISelect<<#=NewStr #>> Join(Expression>, bool>> exp); ISelect<<#=NewStr #>> InnerJoin(Expression>, bool>> exp); ISelect<<#=NewStr #>> RightJoin(Expression>, bool>> exp); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/T4Temp/Select1Provider2`16.tt b/FreeSql/Internal/CommonProvider/SelectProvider/T4Temp/Select1Provider2`16.tt index f9884a84b..962a8c40d 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/T4Temp/Select1Provider2`16.tt +++ b/FreeSql/Internal/CommonProvider/SelectProvider/T4Temp/Select1Provider2`16.tt @@ -214,7 +214,8 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < exp.Parameters.Count; a++) _tables[a].Parameter = exp.Parameters[a]; return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); } - + + ISelect<<#=NewStr #>> ISelect<<#=NewStr #>>.Join(Expression, bool>> exp) => (this as ISelect<<#=NewStr #>>).InnerJoin(exp); ISelect<<#=NewStr #>> ISelect<<#=NewStr #>>.InnerJoin(Expression, bool>> exp) { if (exp == null) return this.InternalJoin(exp?.Body, SelectTableInfoType.LeftJoin); @@ -352,7 +353,8 @@ namespace FreeSql.Internal.CommonProvider var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables); return (this as ISelect<<#=NewStr #>>).LeftJoin((Expression, bool>>)expModify); } - + + ISelect<<#=NewStr #>> ISelect<<#=NewStr #>>.Join(Expression>, bool>> exp) => (this as ISelect<<#=NewStr #>>).InnerJoin(exp); ISelect<<#=NewStr #>> ISelect<<#=NewStr #>>.InnerJoin(Expression>, bool>> exp) { var expModify = new CommonExpression.ReplaceHzyTupleToMultiParam().Modify(exp, _tables);