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