|
ShadowSql拼接sql除了性能突出外还是讲逻辑的
其一为了更好拼接正确的sql,提供代码可读性
其二是为了码农同学爽,拼写起来更简便
以下我就举几个例子给大家观摩一下
一、单表查询示例
为了静态检测,我们首先自定义一个表UserTable用来查询
class UserTable : Table
{
public UserTable()
: base("Users")
{
Id = DefineColumn(nameof(Id));
Status = DefineColumn(nameof(Status));
}
#region Columns
public IColumn Id { get; private set; }
public IColumn Status { get; private set; }
#endregion
}
1、用SqlQuery查询
var users = new UserTable();
var query = users.ToSqlQuery()
.Where(users.Id.LessValue(100));
我们还可以用这样查询
var query = new UserTable()
.ToSqlQuery()
.Where(user => user.Id.Less("LastId"));
sql: SELECT * FROM [Users] WHERE [Id]<@LastId
2、用Query查询
var users = new UserTable();
var query = users.ToQuery()
.And(users.Id.LessValue(100));
换种写法
var query = new UserTable()
.ToQuery()
.And(user => user.Id.Less("LastId"));
sql: SELECT * FROM [Users] WHERE [Id]<@LastId
3、Query可以用&和|重载符查询
var users = new UserTable();
var query = users.ToQuery()
.And(users.Id.LessValue(100) & users.Status.EqualValue(true));
sql: SELECT * FROM [Users] WHERE [Id]<100 AND [Status]=1
var users = new UserTable();
var query = users.ToQuery()
.And(users.Id.LessValue(100) | users.Status.EqualValue(true));
sql: SELECT * FROM [Users] WHERE [Id]<100 OR [Status]=1
二、联表查询示例
为了静态检测,我们自定义两个别名表
class CommentTable : TableAlias<Table>
{
public CommentTable(string tableAlias)
: this(new Table("Comments"), tableAlias)
{
}
private CommentTable(Table table, string tableAlias)
: base(table, tableAlias)
{
Id = AddColumn(Column.Use(nameof(Id)));
PostId = AddColumn(Column.Use(nameof(PostId)));
Content = AddColumn(Column.Use(nameof(Content)));
Pick = AddColumn(Column.Use(nameof(Pick)));
}
public readonly IPrefixColumn Id;
public readonly IPrefixColumn PostId;
public readonly IPrefixColumn Content;
public readonly IPrefixColumn Pick;
}
class PostTable : TableAlias<Table>
{
public PostTable(string tableAlias)
: this(new Table("Posts"), tableAlias)
{
}
private PostTable(Table table, string tableAlias)
: base(table, tableAlias)
{
Id = AddColumn(Column.Use(nameof(Id)));
Title = AddColumn(Column.Use(nameof(Title)));
Author = AddColumn(Column.Use(nameof(Author)));
}
//Id, Title, Author
public readonly IPrefixColumn Id;
public readonly IPrefixColumn Title;
public readonly IPrefixColumn Author;
}
准备好了就方便联表查询了
CommentTable c = new("c");
PostTable p = new("p");
var joinOn = c.Join(p)
.And(c.PostId.Equal(p.Id));
var query = joinOn.Root
.And(c.Pick.EqualValue(true))
.And(p.Author.EqualValue("jxj"));
CommentTable c = new("c");
PostTable p = new("p");
var joinOn = c.SqlJoin(p)
.On(c.PostId.Equal(p.Id));
var query = joinOn.Root
.Where(c.Pick.EqualValue(true))
.Where(p.Author.EqualValue("jxj"));
sql: SELECT * FROM [Comments] AS c INNER JOIN [Posts] AS p ON c.[PostId]=p.[Id] where c.[Pick]=1 AND p.[Author]='jxj'
Query模式和SqlQuery模式各有优点,您喜欢哪种?
源码托管地址: https://github.com/donetsoftwork/Shadow。 如果大家喜欢请动动您发财的小手手帮忙点一下Star。
来源:https://www.cnblogs.com/xiangji/p/18807534 |