大规绣 發表於 2025-4-3 12:36:00

ShadowSql.net之静态查询示例

<p>ShadowSql拼接sql除了性能突出外还是讲逻辑的</p>
<p>其一为了更好拼接正确的sql,提供代码可读性</p>
<p>其二是为了码农同学爽,拼写起来更简便</p>
<p>以下我就举几个例子给大家观摩一下</p>
<p>&nbsp;</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>=&gt; 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:&nbsp;SELECT * FROM &nbsp;&nbsp;WHERE &lt;@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>=&gt; 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>&nbsp;sql:&nbsp;SELECT * FROM &nbsp;&nbsp;WHERE &lt;@LastId</p>
<p>3、Query可以用&amp;和|重载符查询</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>) &amp; users.Status.EqualValue(<span style="color: rgba(0, 0, 255, 1)">true</span>));</pre>
</div>
<p>sql:&nbsp;SELECT * FROM &nbsp;WHERE &lt;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:&nbsp;SELECT * FROM &nbsp;WHERE &lt;100 OR =1</p>
<p>&nbsp;</p>
<p>二、联表查询示例</p>
<p>为了静态检测,我们自定义两个别名表</p>
<div class="cnblogs_code">
<pre>    <span style="color: rgba(0, 0, 255, 1)">class</span> CommentTable : TableAlias&lt;Table&gt;<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&lt;Table&gt;<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>&nbsp;</p>
<p>Query模式和SqlQuery模式各有优点,您喜欢哪种?</p>
<p>源码托管地址: https://github.com/donetsoftwork/Shadow。<br>如果大家喜欢请动动您发财的小手手帮忙点一下Star。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/xiangji/p/18807534
頁: [1]
查看完整版本: ShadowSql.net之静态查询示例