联表
- 从联表获取数据组件
- 本组件用来处理sql的SELECT语句
- 本组件是对ShadowSql.Core同名组件的扩展
1. 接口
2. 基类
3. 类
4. ToSelect
MultiTableSelect ToSelect(this IMultiView table);
MultiTableSelect ToSelect(this IJoinOn table);
注:不能从IJoin对象获取数据,它的ToSelect实际是操作他的Root联表对象
4.1 从sql联表获取
- 依赖sql联表
CommentAliasTable c = new("c");
PostAliasTable p = new("p");
var select = c.SqlJoin(p)
.And(c.PostId, p.Id)
.Root
.ToSelect();
// SELECT * FROM [Comments] AS c INNER JOIN [Posts] AS p ON c.[PostId]=p.[Id]
4.2 从sql多表获取
- 依赖sql多表
CommentAliasTable c = new("c");
PostAliasTable p = new("p");
var select = c.SqlMulti(p)
.Where(c.PostId.Equal(p.Id))
.ToSelect();
// SELECT * FROM [Comments] AS c,[Posts] AS p WHERE c.[PostId]=p.[Id]
4.3 从逻辑联表获取
- 依赖逻辑联表
CommentAliasTable c = new("c");
PostAliasTable p = new("p");
var select = c.Join(p)
.And(c.PostId.Equal(p.Id))
.Root
.ToSelect();
// SELECT * FROM [Comments] AS c INNER JOIN [Posts] AS p ON c.[PostId]=p.[Id]
4.4 从逻辑多表获取
- 依赖逻辑多表
CommentAliasTable c = new("c");
PostAliasTable p = new("p");
var select = c.Multi(p)
.And(c.PostId.Equal(p.Id))
.ToSelect();
// SELECT * FROM [Comments] AS c,[Posts] AS p WHERE c.[PostId]=p.[Id]
5. Select
5.1 Select方法
- 从表筛选字段
MultiTableSelect Select<TTable>(string tableName, Func<TTable, IColumn> select)
where TTable : ITable;
MultiTableSelect Select<TTable>(string tableName, Func<TTable, IEnumerable<IColumn>> select)
where TTable : ITable;
var select = new CommentTable()
.SqlJoin(new PostTable())
.On(t1 => t1.PostId, t2 => t2.Id)
.ToSelect()
.Select<CommentTable>("Comments", t1 => t1.Content);
// SELECT t1.[Content] FROM [Comments] AS t1 INNER JOIN [Posts] AS t2 ON t1.[PostId]=t2.[Id]
var select = new CommentTable()
.SqlJoin(new PostTable())
.On(t1 => t1.PostId, t2 => t2.Id)
.ToSelect()
.Select<CommentTable>("Comments", t1 => [t1.Id, t1.Content]);
// SELECT t1.[Id],t1.[Content] FROM [Comments] AS t1 INNER JOIN [Posts] AS t2 ON t1.[PostId]=t2.[Id]
5.2 Select重载方法
- 从别名表筛选字段
MultiTableSelect Select<TAliasTable>(string tableName, Func<TAliasTable, IFieldView> select)
where TAliasTable : IAliasTable;
MultiTableSelect Select<TAliasTable>(string tableName, Func<TAliasTable, IEnumerable<IFieldView>> select)
where TAliasTable : IAliasTable;
var select = new CommentAliasTable("c")
.SqlJoin(new PostAliasTable("p"))
.On(c => c.PostId, p => p.Id)
.ToSelect()
.Select<CommentAliasTable>("Comments", c => c.Content);
// SELECT c.[Content] FROM [Comments] AS c INNER JOIN [Posts] AS p ON c.[PostId]=p.[Id]
var select = new CommentAliasTable("c")
.SqlJoin(new PostAliasTable("p"))
.On(c => c.PostId, p => p.Id)
.ToSelect()
.Select<CommentAliasTable>("Comments", c => [c.Id, c.Content]);
// SELECT c.[Id],c.[Content] FROM [Comments] AS c INNER JOIN [Posts] AS p ON c.[PostId]=p.[Id]
6. SelectTable扩展方法
筛选别名表
TMultiTableSelect SelectTable<TMultiTableSelect>(this TMultiTableSelect multiSelect, IAliasTable aliasTable)
where TMultiTableSelect : MultiSelectBase;
TMultiTableSelect SelectTable<TMultiTableSelect>(this TMultiTableSelect multiSelect, string tableName)
where TMultiTableSelect : MultiSelectBase;
CommentAliasTable c = new("c");
PostAliasTable p = new("p");
var select = c.SqlJoin(p)
.On(c.PostId, p.Id)
.ToSelect()
.SelectTable(c);
// SELECT c.* FROM [Comments] AS c INNER JOIN [Posts] AS p ON c.[PostId]=p.[Id]
var select = new Table("Comments")
.SqlJoin(new Table("Posts"))
.OnColumn("PostId", "Id")
.ToSelect()
.SelectTable("Comments");
// SELECT t1.* FROM [Comments] AS t1 INNER JOIN [Posts] AS t2 ON t1.[PostId]=t2.[Id]