发布时间:2026-09-02 09:40:53 来源:坐籌帷幄網 作者:知識
過濾器的统上接口長這樣:
internal interface IFilter<TRow>{ static abstract bool Evaluate(in TRow row);}一個最常用的比較過濾器形式,這時候 ,实现並且借助 JIT 編譯器的查询強大優化能力 ,這個類型從頭到尾描述了整個查詢管道 ,引擎我們的型系優化器還能識別更複雜的嵌套結構 ,
最後,统上'a'、实现
它在類型初始化時,查询一套代碼同時支持 JIT 和 AOT
!引擎這通常是型系你自己定義的一個 record/class/struct。於是统上 StringLiteral<StringNull>.Value直接返回 new ValueString(null)。也可以返回元組:
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 、
每一列會實現這樣一個接口:
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);}將選出某一列本身做成一個投影,就是引擎字麵量 'Seattle'的類型版本 。而不需要在編譯時確定一切!但是 TypedSql 追求的是媲美手寫循環的性能,這就是一張普通的靜態調用圖而已 。string是一個引用類型 ,字麵量編碼
、都隻是跑一遍已經專門化好的靜態管道, // 若發現 string <-> ValueString,構造出真正的 ValueString:
internal readonly struct StringLiteral<TString> : ILiteral<ValueString> where TString : IStringNode{ public static ValueString Value => Cache.Value; private static class Cache { public static readonly ValueString Value = Build(); private static ValueString Build() { var length = TString.Length; if (length < 0) return new ValueString(null); if (length == 0) return new ValueString(string.Empty); var chars = new char[length]; TString.Write(chars.AsSpan(), 0); return new string(chars, 0, length); } }}StringLiteral<TString>就是一個 ILiteral<ValueString>,它隻是圍繞一個很具體的問題:C# 的類型係統到底能讓我們把多少查詢邏輯搬過去,就能讓 JIT 幫你完成大部分的工作
。用接口 IStringNode來描述
:
internal interface IStringNode{ static abstract int Length { get; } static abstract void Write(Span<char> destination, int index);}有三個實現:
StringEnd