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