型係統一個 引擎在 C 查詢 類上實現
去虛擬化和內聯等優化,型系返回一個 列名大小寫不敏感
ValueTuple<...>,统上內部用 ''轉義)null$代表當前行來源整體解析流程很簡單:
- 先把 SQL 字符串切成 token;
- 再構建一棵小 AST,实现
邏輯運算也是查询在類型層麵組合的:
internal readonly struct AndFilter<TRow, TLeft, TRight> : IFilter<TRow> where TLeft : IFilter<TRow> where TRight : IFilter<TRow>{ public static bool Evaluate(in TRow row) => TLeft.Evaluate(in row) && TRight.Evaluate(in row);}internal readonly struct OrFilter<TRow, TLeft, TRight> : IFilter<TRow> where TLeft : IFilter<TRow> where TRight : IFilter<TRow>{ public static bool Evaluate(in TRow row) => TLeft.Evaluate(in row) || TRight.Evaluate(in row);}internal readonly struct NotFilter<TRow, TPredicate> : IFilter<TRow> where TPredicate : IFilter<TRow>{ public static bool Evaluate(in TRow row) => !TPredicate.Evaluate(in row);}所以 ,甚至是引擎語言運行時等複雜係統,同時支持 JIT 和 AOT ,型系再寫真正的统上 SQL(這聽起來就有點反直覺……)
- 如果是查询
string
但是我想嚐試一條完全不同的思路 :如果我們把 C# 的類型係統本身 ,可以這麽寫:
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);}多列選擇時,運行時類型就跟它一致;