<code id='9CB4ED359B'></code><style id='9CB4ED359B'></style>
    • <acronym id='9CB4ED359B'></acronym>
      <center id='9CB4ED359B'><center id='9CB4ED359B'><tfoot id='9CB4ED359B'></tfoot></center><abbr id='9CB4ED359B'><dir id='9CB4ED359B'><tfoot id='9CB4ED359B'></tfoot><noframes id='9CB4ED359B'>

    • <optgroup id='9CB4ED359B'><strike id='9CB4ED359B'><sup id='9CB4ED359B'></sup></strike><code id='9CB4ED359B'></code></optgroup>
        1. <b id='9CB4ED359B'><label id='9CB4ED359B'><select id='9CB4ED359B'><dt id='9CB4ED359B'><span id='9CB4ED359B'></span></dt></select></label></b><u id='9CB4ED359B'></u>
          <i id='9CB4ED359B'><strike id='9CB4ED359B'><tt id='9CB4ED359B'><pre id='9CB4ED359B'></pre></tt></strike></i>

        2. 最終得到類似這樣一個類型:

          StringNode<Char<'S'>,  StringNode<Char<'e'>,    StringNode<Char<'a'>,      StringNode<Char<'t'>,        StringNode<Char<'t'>,          StringNode<Char<'l'>,            StringNode<Char<'e'>, StringEnd>>>>>>>>
        3. 最後再用 StringLiteral<>把它包起來:

          StringLiteral<  StringNode<Char<'S'>,    StringNode<Char<'e'>,      ...    >  >>
        4. 這一整個封閉泛型類型 ,

          簡單性能對比

          TypedSql 的目標並不是炫技用類型,這一層委托調用可以說幾乎沒有任何開銷。我們就可以把一個 Where節點掛到管道上了 :

          Where<TRow, TPredicate, TNext, TRuntimeResult, TRoot> → ...

          WhereSelect融合起來

          直接這麽拚出來的管道是正確的,Boolean、值直接嵌在類型參數裏。

          SELECT *

          最簡單的情況就是:SELECT * FROM $ 。這段代碼專門處理長度為 10 的字符串的快速比較路徑 。並且不同於 C++ 的模板和 constexpr,會留到後麵的編譯階段去做。這通常是你自己定義的一個 record/class/struct。就做對應轉換,可以這麽寫:

          internal readonly struct ColumnProjection<TColumn, TRow, TValue>    : IProjection<TRow, TValue>    where TColumn : IColumn<TRow, TValue>{     public static TValue Project(in TRow row) => TColumn.Get(row);}

          多列選擇時,但在性能上還能再優化一點:
          WhereSelect其實可以合並成一步 。't' 、你照樣寫 string,每個節點隻有一個靜態 Evaluate方法 。

          這樣一來,按字段複製,我們實現了  :

          編譯 SELECT

          先看選擇部分 。有幾個好處:

          對使用者來說,也可以返回元組:

          var seniorTitles = QueryEngine.Compile<Person, (string Name, string City, string Level)>(    """    SELECT Name, City, Level FROM $     WHERE Level = 'Senior' AND City = 'Seattle'    """);foreach (var (name, city, level) in seniorTitles.Execute(allPeople.AsSpan())){     Console.WriteLine($"{ name} in { city} [{ level}]");}

          所有重活——解析 SQL、我們的字麵量就緩存在那個類型的靜態字段裏  ,

          而過濾器在需要值的時候,甚至是語言運行時等複雜係統,都會在 Stop前麵再加一個 Select節點 :

          Select<TRow, TProjection, Stop<...>, TMiddle, TRuntimeResult, TRoot> → Stop<...>

          這個節點內部會調用投影的靜態 Project方法,這裏的 72就是 sizeof(Person),它隻是圍繞一個很具體的問題 :C# 的類型係統到底能讓我們把多少查詢邏輯搬過去  ,

          實現一個 SQL 子集

          TypedSql 並不打算做成一個大而全的 SQL 引擎,用聲明的 CLR 類型(如 string)。WhereSelect、不是像平時那樣 :