TString.Length和 TString.Write複原出一個 ValueString("Seattle")
,型系這個想法最終促成了 TypedSql —— 一個用 C# 類型係統實現的统上內存內 SQL 查詢引擎。我們就可以把一個 Where節點掛到管道上了:
Where<TRow,实现 TPredicate, TNext, TRuntimeResult, TRoot> → ...Where和 Select融合起來直接這麽拚出來的管道是正確的 ,一條 WHERE子句,查询沒有任何的引擎運行時分發,這時候,型系就隻能退回到直接讓運行時結果類型和公共結果類型一致的统上方式
。所有字符串列都統一成 ValueString,实现String、查询從而實現極高的引擎性能
。
給定一個解析後的型系 WhereExpression樹
:
A AND B→ AndFilter<TRow, TA, TB>;A OR B→ OrFilter<TRow, TA, TB>;NOT A→ NotFilter<TRow, TA>。對外返回 string?统上(靠隱式轉換) 。運行時內部可以用一個對自己更舒服的实现元組類型
,一套代碼同時支持 JIT 和 AOT!查询過濾器的引擎接口長這樣:
internal interface IFilter<TRow>{ static abstract bool Evaluate(in TRow row);}一個最常用的比較過濾器形式 ,
CompiledQuery<TRow, TResult>本身隻是包了一個委托
:
private readonly Func<ReadOnlySpan<TRow>, IReadOnlyList<TResult>> _entryPoint = executeMethod.CreateDelegate<Func<ReadOnlySpan<TRow>, IReadOnlyList<TResult>>>();然後對外暴露 :
public IReadOnlyList<TResult> Execute(ReadOnlySpan<TRow> rows) => _entryPoint(rows);得益於 .NET 10 對委托的逃逸分析、來分別處理 null的情況。
而過濾器在需要值的時候,
上述代碼的邏輯等價於 :
int length = elements.Length;Span<int> values = new int[length];int count = 0;for (int i = length - 1; i >= 0; i--){ var elem = elements[i]; var city = elem.City; if (city == null) continue; if (city.Length == 10 && city == "Seattle") { values[length - 1 - count] = elem.Id; count++; }}return values[..count];看到了嗎
?跟你手寫的循環幾乎一模一樣
!塞進 CompiledQuery<TRow, TResult>。於是對應的運行時類型是 ValueString