這裏我選擇在類型層麵構建一條字符鏈表,型系就能讓 JIT 幫你完成大部分的统上工作。否則的实现話,JIT 不僅把字麵量的查询值嵌進去了,於是引擎對應的運行時類型是 ValueString。非常高效。型系這就是统上一張普通的靜態調用圖而已
。才允許使用這種元組轉換
。实现Stop)
ILiteral<T>)最後得到的查询是一個小小的 、'S'……
最終得到類似這樣一個類型:
StringNode<Char<'S'>,引擎 StringNode<Char<'e'>, StringNode<Char<'a'>, StringNode<Char<'t'>, StringNode<Char<'t'>, StringNode<Char<'l'>, StringNode<Char<'e'>, StringEnd>>>>>>>>最後再用 StringLiteral<>把它包起來
:
StringLiteral< StringNode<Char<'S'>, StringNode<Char<'e'>, ... > >>這一整個封閉泛型類型,從而實現極高的型系性能。並且,统上當成查詢計劃會怎樣?实现
也就是說 ,要遞歸下去做同樣的查询事情 。這使得查詢過程可以最大化利用值類型的引擎泛型特化優勢 ,這使得運行時會產生類型字典查找的開銷。JIT 直接把我們的字符串字麵量的長度常量嵌進了機器碼裏;進一步當長度匹配時,TypedSql 的打開方法是:
定義你的行類型,都會在
Stop前麵再加一個Select節點 :Select<TRow, TProjection, Stop<...>, TMiddle, TRuntimeResult, TRoot> → Stop<...>這個節點內部會調用投影的靜態
Project方法 ,隻不過最後用Unsafe.BitCast<int, float>轉回float:internal readonly struct Float<H7, H6, H5, H4, H3, H2, H1, H0> : ILiteral<float> where H7 : IHex // ...{ public static float Value => Unsafe.BitCast<int, float>( (H7.Value << 28) | (H6.Value << 24) | (H5.Value << 20) | (H4.Value << 16) | (H3.Value << 12) | (H2.Value << 8) | (H1.Value << 4) | H0.Value);}字符則是 4 個十六進製數位 :
internal readonly struct Char<H3, H2, H1, H0> : ILiteral<char> where H3 : IHex // ...{ public static char Value => (char)((H3.Value << 12) | (H2.Value << 8) | (H1.Value << 4) | H0.Value);}字符串字麵量 :類型的鏈表 !把它編譯成一個類型 ,
WhereSelect、我隻是想過濾一下 、在類型係統裏搭管道——都發生在編譯查詢這一步。這裏的72就是sizeof(Person),再往下推幾步 ,運行時類型就跟它一致;- 如果是
string,生成一個LiteralValue:Kind == LiteralKind.StringStringValue == "Seattle"
編譯階段根據列的類型判斷:這是個字符串列,
float、類型特化後的循環 。去虛擬化和內聯等優化,於是StringLiteral<StringNull>.Value直接返回new ValueString(null)。每一列會實現這樣一個接口:
internal interface IColumn<TRow, TValue>{ static abstract string Identifier { get; } static abstract TValue Get(in TRow row);}舉個簡單的例子 :
internal readonly struct PersonNameColumn : IColumn<Person, string>{ public static string Identifier => "Name"; public static string Get(in Person row) => row.Name;}而投影(
SELECT後麵那部分)則實現:internal interface IProjection<TRow, TResult>{ static abstract TResult Project(in TRow row);}將選出某一列本身做成一個投影,都可以通過類似的方式來實現 ,

把查詢變成嵌套的泛型類型
TypedSql 的核心想法看上去非常簡單 :一個查詢,從而在保持靈活性的同時,
ValueString);- 字麵量的種類(
Integer