Provider features: Nextorm vs linq2db
A dated, per-engine comparison of the provider-specific API surface: for each SQL engine both libraries support, how much of that engine's own feature set is exposed through a dedicated API wired to the query builder. Marks are judgement calls against the public documentation and source of both libraries, as of 2026-10-04.
This page answers a narrower question than Capabilities. Capabilities asks whether a
construct can be expressed; this page asks whether there is a dedicated provider API for it. A no means
no dedicated API was found — the construct may still be reachable through raw SQL (or, for linq2db, through
Sql.Ext/Sql.Function).
How to read the marks
- yes — a first-class provider API is present.
- partial — present with a named limitation, or reachable only through a generic mechanism.
- no — no dedicated provider API found.
- n/a — the feature does not exist on that engine.
Each table ends with a Total row: the yes / partial / no counts per library (n/a is excluded).
Provider footprint
| Engine | Nextorm | linq2db |
|---|---|---|
| SQLite | yes | yes |
| SQL Server | yes | yes |
| PostgreSQL | yes | yes |
| MySQL | yes (own provider) | yes |
| MariaDB | yes (own provider) | partial (shared MySQL provider, MySqlVersion.MariaDB10; no separate extension surface) |
| ClickHouse | yes | yes |
| In-memory object context | yes | no |
| Oracle, Firebird, DB2, SAP HANA, Informix, Sybase, Access, SQL CE, DuckDB, Ydb | no | yes |
| Total | 7 / 0 / 1 | 6 / 1 / 1 |
linq2db does not ship an in-memory object context. Nextorm splits MySQL and MariaDB into separate providers; linq2db models MariaDB as a MySQL version.
Key finding
Nextorm covers provider-specific features more broadly. Across the six SQL engines both libraries
support, Nextorm exposes a dedicated provider-specific API on a wider set of surfaces than linq2db: a
per-provider scalar-function library for every engine, the ClickHouse
clause/aggregate/table-function/tuple/native-JSON surface, PostgreSQL
full-text/regex/jsonb_path_*/range/data-modifying CTE/table functions, SQL Server sequences and row locking,
MySQL/MariaDB JSON/regex/sequences, and SQLite JSON1/regex/aggregates/LOB/FTS5 maintenance — all wired to the
query builder rather than raw SQL.
This is a statement about per-engine feature depth, not the number of engines: linq2db connects to more database products (Oracle, Firebird, DB2, SAP HANA, Informix, Sybase, Access, SQL CE, DuckDB, Ydb), while Nextorm adds an in-memory object context and splits MySQL/MariaDB into separate providers. linq2db remains wider on SQL Server scalar-function breadth and hint variety (issue #182).
PostgreSQL
| Feature | Nextorm | linq2db |
|---|---|---|
Arrays + any/all quantifiers |
yes | yes |
| Range / multirange (operators, mapping) | yes | partial (type mapping only) |
Full-text tsvector/tsquery |
yes | no |
Regex (~, ~*, regexp_replace) |
yes | no |
JSONB + jsonb_path_* |
yes | partial (type mapping only) |
Data-modifying CTE (WITH x AS (INSERT ... RETURNING ...)) |
yes | no |
DML RETURNING (including update/delete join) |
yes | yes |
MERGE (15+) |
yes | yes |
Upsert ON CONFLICT |
yes | yes |
Query hints /*+ ... */ |
yes | partial (subquery table hints and locking only) |
CTAS / temporary / ON COMMIT / WITH NO DATA |
yes | yes |
Bulk copy (COPY BINARY) |
yes | yes |
Sequences + runtime settings (current_setting/set_config) |
yes | no |
| Boolean / bit / statistical / regression aggregates, ordered-set percentiles | yes | partial |
Table-valued parameters (array / jsonb_to_recordset) |
yes | no |
Named windows / GROUPS / EXCLUDE |
yes | yes |
DISTINCT ON, TABLESAMPLE, WITH TIES |
yes | no |
Table functions / set-returning functions (generate_series, unnest, regexp_matches, jsonb_*, ts_stat, ...) |
yes | partial (unnest/generate_series only) |
Row locking (FOR UPDATE / FOR SHARE, per-source OF, wait modes) |
yes | yes |
Session/server identity (pg_backend_pid, inet_*) |
yes | no |
| Total | 20 / 0 / 0 | 8 / 5 / 7 |
Net: Nextorm leads — full-text, regex, jsonb_path_*, range operators, data-modifying CTE,
sequences/settings, table-valued parameters and the aggregate families have dedicated Nextorm APIs but no
linq2db ones.
SQL Server
| Feature | Nextorm | linq2db |
|---|---|---|
OUTPUT / OUTPUT ... INTO |
yes | yes |
MERGE (branches, BY SOURCE) |
yes | yes |
| Hints (table / query / join / tables-in-scope / index) | yes | yes (wider) |
Temporal FOR SYSTEM_TIME |
yes | yes |
FOR JSON / FOR XML |
yes | partial |
XML data-type methods (.value/.query/.exist/.nodes) |
yes | partial |
OPENJSON / STRING_SPLIT / CONTAINSTABLE / FREETEXTTABLE |
yes | yes |
Native PIVOT / UNPIVOT |
yes | no |
Full-text contains / freetext |
yes | yes |
Text JSON (json_value/json_query/json_modify/isjson) |
yes | partial |
Regex (REGEXP_LIKE/REGEXP_REPLACE, 2025+) |
yes | no |
| Native table-valued parameters | yes | yes |
Bulk copy + SqlBulkCopyOptions |
yes | yes |
| Stored procedures | yes | yes |
Window percentiles (WITHIN GROUP ... OVER) |
yes | partial |
| Provider scalar-function breadth | yes | yes |
Sequences (NEXT VALUE FOR) |
yes | yes |
Row locking (ForUpdate/ForShare, LockWaitMode → with (updlock)/with (holdlock)) |
yes | yes |
Session/server identity (@@SERVERNAME, HOST_NAME, APP_NAME, SUSER_NAME, ORIGINAL_LOGIN) |
yes | yes |
| Total | 19 / 0 / 0 | 13 / 4 / 2 |
Net: parity on the audited T-SQL scalar catalogue, with linq2db still wider overall. Issue
#182 reconciled 61 pinned linq2db SqlFn.cs entries
against Nextorm: 51 covered and 10 excluded, where the excluded set is live, mutable
connection/session/statement-scope state rather than per-row query scalars. The identity subset
(@@SERVERNAME, HOST_ID, HOST_NAME, APP_NAME, SUSER_NAME, ORIGINAL_LOGIN) shipped in
#219, leaving the rest tracked in
#248. Nextorm leads on first-class builders for
PIVOT/UNPIVOT, FOR JSON/FOR XML, XML methods, OPENJSON/STRING_SPLIT and the 2025 regex functions.
MySQL / MariaDB
| Feature | Nextorm | linq2db |
|---|---|---|
Text JSON (json_value/json_query/json_modify/isjson) + mutation |
yes | no |
Regex (REGEXP_LIKE/REGEXP_REPLACE) |
yes | no |
Full-text MATCH ... AGAINST |
yes | yes |
Upsert ON DUPLICATE KEY UPDATE + INSERT IGNORE |
yes | yes |
Index hints USE/FORCE/IGNORE INDEX |
yes | yes |
Query hints /*+ ... */ |
yes | yes |
DML RETURNING / OUTPUT |
partial (MariaDB UPDATE ... RETURNING, 13.0+; MySQL none) |
no |
Full MERGE statement (branches, BY SOURCE) |
no (engine; the key-upsert Merge() lowers to ON DUPLICATE KEY UPDATE) |
no (engine) |
| CTAS / temporary / column list | yes | yes |
Table-valued parameters (JSON_TABLE) |
yes | no |
Window functions (percent_rank/nth_value) |
yes | partial (MySQL 8+) |
Binary UUID helpers (uuid_to_bin/bin_to_uuid) |
yes | no |
| Provider scalar-function library | yes | partial (thin; full-text only) |
MariaDB temporal FOR SYSTEM_TIME |
yes | no |
MariaDB sequences (NEXT VALUE FOR, nextval/setval/lastval) |
yes | no |
MariaDB NVL/NVL2/ADD_MONTHS/MONTHS_BETWEEN/TO_CHAR/JSON_DETAILED/XXH3 |
yes | no |
MariaDB INTERSECT ALL / EXCEPT ALL |
yes | partial |
Arbitrary-value aggregate (any → ANY_VALUE(x) on MySQL; MariaDB rejects) |
yes | no |
Row locking (FOR UPDATE/FOR SHARE; MariaDB source-level OF unsupported by design, fail-closed) |
partial | yes |
Session/server identity (CONNECTION_ID(), USER()) |
yes | no |
| Total | 17 / 2 / 1 | 6 / 3 / 11 |
Net: Nextorm leads — JSON, regex, UUID helpers, table-valued parameters and the MariaDB-specific families
(temporal, sequences, string/date functions, set-operation ALL) have no linq2db provider API; linq2db is
ahead only on hint variety.
SQLite
| Feature | Nextorm | linq2db |
|---|---|---|
LOB streaming via rowid locator |
yes | no |
DML RETURNING |
yes | yes |
Upsert ON CONFLICT DO UPDATE / DO NOTHING + INSERT OR IGNORE |
yes | yes |
Index hints INDEXED BY / NOT INDEXED |
yes | yes |
JSON1 (json()/jsonb()/json_extract, ->/->>, json_each/json_tree) |
yes | no |
Regex (regexp/regexp_replace) |
yes | no |
Custom aggregates (stdev/stdevp/var/varp) |
yes | no |
Named windows / GROUPS / EXCLUDE, percent_rank/cume_dist/nth_value |
yes | partial |
Table-valued parameters (json_each) |
yes | no |
| CTAS / temporary table | yes | yes |
Full-text query + FROM (FTS3 / FTS4 / FTS5) |
yes | yes (extensive) |
FTS5 maintenance/control (automerge/crisismerge/merge/optimize/rebuild/integrity-check) |
yes | yes (also FTS3/FTS4) |
| Provider scalar-function library | yes | no (full-text only) |
| Session/server identity | no (fails closed; only version() is rendered) |
no |
| Total | 13 / 0 / 1 | 6 / 1 / 7 |
Net: mixed, net Nextorm broader — Nextorm adds JSON1, regex, custom aggregates, window frame
GROUPS/EXCLUDE, table-valued parameters, LOB streaming, the SQLite full-text query + FROM surface
(#181) and the FTS5 maintenance/control command
builder (#195/#196).
linq2db still leads only on FTS3/FTS4 maintenance and the FTS5 delete/delete-all/pgsz/usermerge
commands.
ClickHouse
| Feature | Nextorm | linq2db |
|---|---|---|
String JSON (JSONExtract*/visitParamExtract*, JSON_VALUE/JSON_QUERY/JSON_EXISTS) + JSONAllPaths/toJSONString |
yes | no |
| Arrays + higher-order (lambda) functions | yes | partial |
ARRAY JOIN clause |
yes | no |
Regex (match/replaceRegexpAll, RE2) |
yes | partial |
Join strictness ANY/ALL/ASOF, GLOBAL, SEMI/ANTI/PASTE |
yes | partial |
FINAL / SAMPLE / PREWHERE / SETTINGS |
yes | partial |
LIMIT n BY expr |
yes | no |
GROUP BY ... WITH TOTALS |
yes | no |
Distributed GLOBAL IN |
yes | no |
Dictionaries (dictGet/dictHas/...) |
yes | no |
uniq/quantile/top-K/sequence aggregates, argMin/argMax, -If combinator, bitmap/sumMap |
yes | partial |
lagInFrame/leadInFrame frame functions |
yes | no |
Named windows / frame GROUPS, percent_rank/cume_dist/nth_value |
yes | partial |
Table functions (numbers/zeros/generateRandom/values/url/s3/file/remote*/cluster*) |
yes (declared) | no |
Date conversion surface (toDate/toStartOf*/toYYYYMM/...) |
yes | partial |
Map / hash / generateULID scalars |
yes | no |
CTAS ENGINE = MergeTree ... AS SELECT |
yes | yes |
DML mutations (ALTER TABLE ... UPDATE/DELETE) |
yes | no |
Table-valued parameters (Array(T)/Array(Tuple) + arrayJoin) |
yes | no |
| Stored procedures / bulk copy / transactions / LOB streaming | no (engine) | no (engine) |
Tuple surface (tuple(...), tupleElement, arity 1-7) |
yes | no |
Native JSON column type ([JsonColumn], JsonObject/JsonDocument/JsonElement) |
yes | no |
any/anyLast overloads + multi_if (multi-branch conditional) |
yes | no |
Session/server identity (connectionId(), hostName(), tcpPort()) |
yes | no |
| Total | 23 / 0 / 1 | 1 / 7 / 16 |
Net: Nextorm leads decisively — linq2db's public ClickHouse-specific surface is essentially AsClickHouse
plus hints, while Nextorm exposes the clause set, aggregate families, dictionaries, table functions and the
scalar library.
Net assessment
Across the six shared engines, Nextorm exposes a dedicated provider-specific API on a wider set of surfaces. The strongest Nextorm-only areas, with no linq2db equivalent found:
- A per-provider scalar-function library for all providers:
SqlFunctions.Postgres,SqlFunctions.SqlServer,SqlFunctions.MySql,SqlFunctions.SqliteandSqlFunctions.ClickHouse, plus the shared session-info gate that carries the identity scalars of #219 across four providers. - PostgreSQL: full-text, regex,
jsonb_path_*, range operators, data-modifying CTE, table functions (generate_series/unnest/jsonb_*/ts_stat), sequences/settings, boolean/bit/statistical/regression aggregates, ordered-set percentiles, table-valued parameters. - MySQL/MariaDB: JSON, regex, binary UUID, the arbitrary-value aggregate (
any→ANY_VALUE), and the whole MariaDB-specific family (temporal, sequences,NVL/ADD_MONTHS/TO_CHAR/JSON_DETAILED/XXH3, set-operationALL). - SQLite: JSON1, regex, custom aggregates, window frame
GROUPS/EXCLUDE, table-valued parameters,rowidLOB streaming, FTS5 maintenance/control. - ClickHouse: the clause set (
FINAL/SAMPLE/PREWHERE/SETTINGS/LIMIT BY/ARRAY JOIN/WITH TOTALS/GLOBAL IN), aggregate families with-Ifcombinators andany/anyLast, dictionaries, table functions, the tuple surface, nativeJSONcolumns,multi_if, the scalar library. - First-class fluent builders wired to the query builder (
OUTPUT INTO,MERGE,PIVOT/UNPIVOT,FOR JSON/FOR XML, temporal,WITH TOTALS) rather than raw SQL.
Where linq2db leads or matches:
- SQL Server scalar-function breadth and hint variety.
- SQLite full-text FTS3/FTS4 maintenance and the FTS5
delete/delete-all/pgsz/usermergecommands; Nextorm ships the query + FROM surface and the FTS5 maintenance/control command builder. - A broader engine list (Oracle, Firebird, DB2, SAP HANA, Informix, Sybase, Access, SQL CE, DuckDB, Ydb).
Parity (both, engine permitting): core DML RETURNING/OUTPUT/MERGE/upsert, bulk copy, stored procedures,
sequences, row locking, generic CTAS/temporary tables, index/query hints, named windows.
Caveats
- A
nois a finding from searching each library's provider-specific extension surface, not proof of impossibility: the construct remains expressible through raw SQL (orSql.Ext/Sql.Functionin linq2db). The claim is about the width of the dedicated provider API. - Some Nextorm entries (distributed ClickHouse table functions) are declared and gated but intentionally out of scope end-to-end — see the ClickHouse provider.
- linq2db's provider surfaces evolve; the marks are dated 2026-10-04.
- MySQL and MariaDB are separate Nextorm providers but a single linq2db provider, so the MySQL/MariaDB table folds both libraries' shapes into one list.
- NativeAOT is not a per-provider row: linq2db does not officially support it, while Nextorm's zero-config
contract (
PublishAot=trueonly) is verified on SQLite today — see the NativeAOT guide.
See also
- Capabilities — the construct-level matrix across Dapper, linq2db and EF Core.
- Benchmarks and Feature benchmarks.
- Provider overview.
- Provider-specific SQL.
- Scalar functions.
- Limitations and out-of-scope features.