Repository navigation
Releases
1.0.9
dotnet add package nextorm
dotnet add package nextorm.sqlite
dotnet add package nextorm.sqlserver
dotnet add package nextorm.postgres
dotnet add package nextorm.mysql
dotnet add package nextorm.mariadb
dotnet add package nextorm.clickhouse
dotnet add package nextorm.extensions
dotnet add package nextorm.entityframeworkcore ← published for the first time
1.0.9 is the first stable release, so --prerelease is no longer needed; previews (1.0.10-a.x and later)
still require it. Package Manager Console equivalent: Install-Package nextorm.
Highlights
The public API is frozen and tracked
Each package ships a PublicAPI.Shipped.txt, Microsoft.CodeAnalysis.PublicApiAnalyzers compares the real
surface against it on every build, and an undeclared addition (RS0016) or a stale declaration (RS0017) fails
the build. The one published breaking change was made deliberately, before the freeze:
ISqlDialect.SupportsAnyAggregates → SupportsAnyLastAggregate (the flag gates only any_last) (#53).
.NET 11
The packages multi-target net10.0;net11.0, so a .NET 11 application resolves a native asset instead
of rolling forward from net10.0. Tests, benchmarks and examples run on net11.0, and the toolchain moved
to the .NET 11 SDK. .NET 10 stays the floor (#387).
Joins and set operations without boilerplate
A join no longer requires a hand-built source: Join<TJoinEntity>(...) resolves the entity by type, and the
string-table form resolves it by name, across all seven operators — Join, LeftJoin, RightJoin,
FullJoin, CrossJoin, CrossApply, OuterApply (#384). Set operations accept the right operand as an
entity selector instead of a prebuilt query (#385).
Build-once query construction (M1–M3)
A cached query binds closure values into the plan published by the first call instead of rebuilding,
re-preparing and re-rendering the statement: a value-agnostic shape is derived from the raw graph and
looked up in a thread-local candidate index, with symbols and captured member paths part of the shape, so a
hash collision cannot select a wrong plan. Against linq2db, allocations are now 0.840× on Any
(196.13 KB vs 233.62 KB, was 1.585×) and 1.088× on a paged projection (19.16 KB vs 17.61 KB); Where
(1.471×) and GroupByCount (1.229×) stay as documented residuals with their attribution, and no time
regression was observed (#319).
Correctness
From(string)and the string-table join overloads reject null, empty and whitespace table names instead
of failing later withNullReferenceExceptionor rendering invalid SQL (#386).- JSON streaming: a
decimalprojection over a float/REAL column no longer serializes the binary expansion
(12.3399…instead of12.34) — streamed and materialized values now agree (#388). SelectGroupHavingtypes its condition by the projection result rather than by the source entity (#380).
New package
nextorm.entityframeworkcore reaches nuget.org for the first time: db.CreateNextOrmContext() runs nextorm
queries over an existing EF Core DbContext connection and transaction, reusing the EF model mapping. The
package was buildable before but missing from the release job.
Breaking changes
ISqlDialect.SupportsAnyAggregates→SupportsAnyLastAggregate(#53).SelectGroupHaving: the condition is typed by the projection result, so explicit generic arguments of the
previous form no longer compile (#380).- Packages ship two assets (
net10.0andnet11.0) instead of one (#387).
What's Changed
- Public API: the surface is frozen and tracked by
PublicApiAnalyzers+PublicAPI.Shipped.txtin every package, and RS0016/RS0017 fail the build by @AlexeyShirshov in #53 - .NET 11: the packages multi-target
net10.0;net11.0, tests/benchmarks/examples run onnet11.0, and the toolchain moves to the .NET 11 SDK by @AlexeyShirshov in #387 - Joins without
From(...): the source resolves by entity type or by table name across all seven operators by @AlexeyShirshov in #384 - Set operations: the right operand can come from an entity selector instead of a prebuilt query by @AlexeyShirshov in #385
- Core:
From(string)and the string-table join overloads reject null/empty/whitespace table names instead of failing later by @AlexeyShirshov in #386 - JSON streaming: a
decimalprojection over a float/REAL column no longer serializes the binary expansion by @AlexeyShirshov in #388 SelectGroupHaving: the condition is typed by the projection result, not by the source entity by @AlexeyShirshov in #380- Build-once query construction (M1–M3): a cached query binds closure values into the published plan instead of rebuilding the statement by @AlexeyShirshov in #319
- Release:
nextorm.entityframeworkcoreadded to the publish job, which now ships 9 packages by @AlexeyShirshov in #390 - CI: the NativeAOT job no longer dies on a flaky apt mirror — the prerequisites step skips apt when
clangand the zlib headers are already present and otherwise retries by @AlexeyShirshov in b12bb5f6 - Docs: community contribution guide and a README section pointing at it by @AlexeyShirshov in #382 and #383
- Benchmarks: comparison tables refreshed by @github-actions[bot] in #372
Known limitations
- NativeAOT stays partial and experimental:
net11.0,linux-x64and the SQLite provider only. The remaining providers, the compile-time query pipeline and the residual IL2xxx/IL3xxx diagnostics are tracked in #370 - In-memory execution of
SelectGroup/SelectGroupHavingis not supported by design — the in-memory provider throwsNotSupportedException, so those operators need a real database (extensions guide) PackageValidationBaselineVersionis not set yet: a stable baseline can only be declared once1.0.9is on nuget.org, so the first package validation against it happens in1.0.10(#389)- Integration branch coverage sits at 75.1 % against a 75 % gate; raising it is tracked separately from this release
Full Changelog: v1.0.9-rc5...v1.0.9
1.0.9-rc5
dotnet add package nextorm
dotnet add package nextorm.sqlite
dotnet add package nextorm.sqlserver
dotnet add package nextorm.postgres
dotnet add package nextorm.mysql
dotnet add package nextorm.mariadb
dotnet add package nextorm.clickhouse
dotnet add package nextorm.extensions ← new package, published for the first time
Highlights
Extensibility is a first-class feature
Operators are no longer hard-wired into the engine. Core now exposes the same mechanism it uses
internally, so a query operator can be written, tested and shipped in a separate package:
nextorm.extensions(new package) —SelectWhereMin/SelectWhereMaxand
SelectGroup/SelectGroupHavinglive here, implemented on public query components (#362, #365,
#368). The in-core copies are frozen asSelectWhereMinOld/SelectWhereMaxOldand scheduled for
removal;SelectGroupis gone from core.- Public preparation contract —
IQueryComponent+WithComponent,
IQueryPreparationDescriptor,QueryPreparationContributionandExclusiveGrouping. No
InternalsVisibleTo, no translator registry, no global mutable state. The extension package is
the proof: it is built against the public surface only, with integration coverage of its own. - Component overhead is measured, not assumed — the extra contribution path was benchmarked and
accepted in #368.
Zero-config NativeAOT (partial and experimental)
PublishAot=true is the only change an application makes — no compiled model, no precompilation
step, no interceptor opt-in, no manual entity or query registration. Verified surface today: SQLite,
net10.0, linux-x64, with six JIT-parity scenarios plus extension component slices. The new CI
job aot publishes the native runner and executes it on every push, so the claim cannot silently
rot (#366 closed with a remainder, tracked in #370).
Real-world check on a 13 GB SQLite reporting app (oc-report, 3-day window, byte-identical output):
| Implementation | JIT | NativeAOT | Binary | Peak RSS | Consumer changes |
|---|---|---|---|---|---|
| nextorm | 0.42 s | 0.12 s | 8.2 MB | 30 MB | PublishAot=true |
| EF Core 10.0.14 | 1.03 s | 0.23 s | 17.3 MB | 42 MB | compiled model + query precompilation + InterceptorsNamespaces |
| Dapper 2.1.89 + Dapper.AOT 1.1.0 | 0.26 s | 0.12 s | 3.5 MB | 19 MB | Dapper.AOT + [module: DapperAot] + InterceptorsNamespaces, statically known SQL only |
linq2db has no official NativeAOT support. The reference app ships in the repository as
examples/nextorm.examples.oc-report;
the contract and the residual diagnostics (230 unique / 236 raw for the AOT runner) are documented in
NativeAOT.
Breaking changes (prerelease)
SelectWhereMin/SelectWhereMaxmoved tonextorm.extensions(four overloads, no*Exaliases); the built-in core methods becameSelectWhereMinOld/SelectWhereMaxOld. A consumer needs a reference tonextorm.extensions, otherwise the previous calls no longer compile (#365)SelectGroupwas removed from core and re-implemented innextorm.extensionstogether with the newSelectGroupHaving; core gained the public preparation mechanism (IQueryPreparationDescriptor,QueryPreparationContribution,ExclusiveGrouping). In-memory execution for the grouping operators is explicitly not supported (NotSupportedException); explicit generic arguments now require both type parameters (#362, #368)- New package:
nextorm.extensionshad never been published, so thepublishjob grows from 7 to 8 packages
Behavioural changes without signature changes: OrderBy(p => new { … }) expands into columns instead of concatenating them into invalid SQL (#360), a CTE descriptor produced by an aliased chain keeps Alias.X (#361), hand-written ManyToOne metadata with the wrong arity reports a named diagnostic instead of IndexOutOfRangeException (#353), group_array over a Tuple element renders a valid type (#359), xxh3/xxh32 are no longer advertised on MariaDB 11.4 (#352), and a ClickHouse UNION ALL row-order flake is fixed (#369).
What's Changed
- Extensibility:
SelectWhereMin/SelectWhereMaxproven on public query components outside core by @AlexeyShirshov in #362 nextorm.extensions:SelectWhereMinEx/SelectWhereMaxExon public query components (legacy path frozen as baseline) by @AlexeyShirshov in #365SelectGroup/SelectGroupHavinginnextorm.extensions; component-operator overhead measured and accepted by @AlexeyShirshov in #368- NativeAOT: partial support declared (SQLite, .NET 10 /
linux-x64), native runner published and executed in CI; remainder tracked in #370 by @AlexeyShirshov in #366 - Perf: warm
EXCEPT/INTERSECTallocations brought close to linq2db by @AlexeyShirshov in #245 - Perf: JSON streaming 10k-row throughput at linq2db parity by @AlexeyShirshov in #247
- Perf: JSON streaming noise-robust ratio oracle and same-session acceptance pairing by @AlexeyShirshov in #311
- Perf: CSV terminal no longer rebuilds its column plan on every export (terminal plan cache) by @AlexeyShirshov in #250
- Perf: plan hash/fingerprint memoized per description version (warm path) by @AlexeyShirshov in #317
- Perf:
QueryCommand.Clone()no longer copies empty collections by @AlexeyShirshov in #318 - Perf: the raw pre-preparation recipe is eligible for derived subquery sources, so a fresh call no longer pays a full prepare by @AlexeyShirshov in #363
- Perf:
SelectWhereMax/Minportable lowering revisited (GROUP BY / join-back strategy) by @AlexeyShirshov in #302 - Perf: lower allocations in the PG
DelayPercentilesByModelexample by @AlexeyShirshov in #267 - Perf: lower allocations in the PG
AircraftDelayChainsexample by @AlexeyShirshov in #268 - Perf: lower allocations in the PG
AirportOnTimePerformanceexample by @AlexeyShirshov in #269 - Perf: lower allocations in the CH
Funnelexample by @AlexeyShirshov in #270 - Perf: lower allocations in the CH
Sessionsexample by @AlexeyShirshov in #272 - Perf: lower allocations in the CH
SessionDepthexample by @AlexeyShirshov in #273 - Perf: lower allocations in the CH
RollingActivityexample by @AlexeyShirshov in #274 - Epic: build-once query construction (lazy descriptor chain) closed as a candidate without a schedule by @AlexeyShirshov in #319
- MariaDB 11.4:
xxh3/xxh32are no longer advertised — the server has no such functions by @AlexeyShirshov in #352 - Core: hand-written
ManyToOnemetadata withFK.Count > PrincipalKey.Countreports a named diagnostic instead ofIndexOutOfRangeExceptionby @AlexeyShirshov in #353 - ClickHouse:
group_arrayover aTupleelement renders a validArray(Nullable(Tuple))by @AlexeyShirshov in #359 - Core: a composite
OrderBy(p => new { … })key expands into columns instead of being concatenated into invalid SQL by @AlexeyShirshov in #360 - Join aliases: a CTE descriptor produced by an aliased chain no longer drops
Alias.Xby @AlexeyShirshov in #361 - Coverage: integration branch coverage raised from 74.4 % to 75.6 %, CI threshold moved from 74 to 75 by @AlexeyShirshov in #364
- Tests:
T300 NullableScalarMaterialize_Liveno longer depends on row order of an unorderedUNION ALL(ClickHouse flake) by @AlexeyShirshov in #369
Known limitations
- NativeAOT is partial and experimental: SQLite,
net10.0,linux-x64only. The remaining providers, the EF Core bridge and the residual IL2xxx/IL3xxx diagnostics are tracked in #370 (#366 closed with a remainder) ToDataReader(raw reader) is still slower than linq2db; a further win needs a different reader-ownership model, accepted as a remainder (#246)- The CH
Retentionexample still allocates 3.02× linq2db, accepted together with the other example tasks (#271) - In-memory execution of the grouping operators (
SelectGroup/SelectGroupHaving) is not supported by design (#367)
Full Changelog: v1.0.9-rc4...v1.0.9-rc5
1.0.9-rc4
dotnet add package nextorm
dotnet add package nextorm.sqlite
dotnet add package nextorm.sqlserver
dotnet add package nextorm.postgres
dotnet add package nextorm.mysql
dotnet add package nextorm.mariadb
dotnet add package nextorm.clickhouse
Breaking changes (prerelease)
Avg/avg_overover an integer column now returnsdouble?/WindowFunction<double?>instead of an integer type — the silent truncation is gone (#291)Prepare(bool nonStreamUsing, CancellationToken)is replaced byPrepare(PrepareOptions, CancellationToken)(per-connection command cache by default);DbCommandandLastRowCountare removed from the prepared API (#333)ITransactionManagergainsCreateSavepoint/RollbackToSavepoint/ReleaseSavepointas default interface members (#289)- MERGE supports expression-based per-column assignments in
ThenUpdate/ThenInsert(#301) - Behavioural changes without signature changes:
== null/!= nullon a nullable value type rendersIS NULL/IS NOT NULL(#296);WithTies()with a non-zeroOFFSETfails closed on SQL Server (#298); string-literal escaping and backslash/NUL modes (#299, #327); plan identity includesApplySource(#316); rawArgumentException/InvalidOperationExceptionreplaced by documentedNotSupportedExceptionand contextualQueryPreparationException(#293–#295, #307, #313–#315, #343); ClickHouseErrorCode -1is no longer treated as a transport signal (#338)
What's Changed
- Examples: typed CTEs and named aliases in every join by @AlexeyShirshov in #231
- SQL Server live-scope scalars: the seven exceptions from #182 opened (
CURRENT_REQUEST_ID,XACT_STATE,SCOPE_IDENTITY, …) by @AlexeyShirshov in #248 - Metadata-driven SQL loading:
LoadWithfor every relationship and implicit collection projections by @AlexeyShirshov in #249 - Composite relationships: public declaration, SQL navigations and metadata-driven
LoadWithby @AlexeyShirshov in #251 - ClickHouse:
array_exceptrendered the non-existentarrayExceptby @AlexeyShirshov in #252 - ClickHouse:
bit_length/octet_lengthreturnedUInt64but were declaredint?(InvalidCastException) by @AlexeyShirshov in #253 - ClickHouse:
md5/sha1/sha256/sha512digests were decoded as lossy UTF-8 strings by @AlexeyShirshov in #254 - ClickHouse:
date_diffreturnsInt64but was declaredint?(InvalidCastException) by @AlexeyShirshov in #255 - ClickHouse:
date_add("century", n, …)returned a wrong date by @AlexeyShirshov in #256 - ClickHouse:
map_filter/map_apply/map_all/map_exists/map_sortrendered an invalid argument type by @AlexeyShirshov in #257 - SQL Server:
quotename(value, quote_character)rendered an unterminated string literal by @AlexeyShirshov in #258 - SQL Server: the
timefrompartsresult (time) can be materialised intoTimeSpanby @AlexeyShirshov in #259 - PostgreSQL 17:
array_reverse/array_sort/uuidv7were rendered although the server has no such functions by @AlexeyShirshov in #260 - PostgreSQL:
sha256(byte[])bound the array as an integer parameter by @AlexeyShirshov in #261 - PostgreSQL:
log(base, x)rendered a call with no matching server overload by @AlexeyShirshov in #262 - PostgreSQL:
json_get(object?, key)produced an ambiguousunknown -> unknownoperator by @AlexeyShirshov in #263 - PostgreSQL:
make_intervalwith months can be materialised intoTimeSpanby @AlexeyShirshov in #264 - SQL Server: composable DML
OUTPUT—INSERT/UPDATE/DELETE/MERGEoutput as a queryable source by @AlexeyShirshov in #266 - ClickHouse: array-returning functions declare the element types the driver actually returns by @AlexeyShirshov in #276
- ClickHouse: higher-order array functions on a column array failed with "variable x is not defined" by @AlexeyShirshov in #277
- SQLite:
soundexis no longer advertised — the server has no such function by @AlexeyShirshov in #278 - Correlated
LongCount()returned 1 instead of the per-row count by @AlexeyShirshov in #279 - MariaDB:
months_between/to_date/to_number(anduuid_v4) are no longer advertised on 11.4 by @AlexeyShirshov in #280 - PostgreSQL function-catalogue gaps: the remaining built-in catalogue by @AlexeyShirshov in #281
- SQL Server function-catalogue gaps: the remaining built-in catalogue by @AlexeyShirshov in #282
- MySQL function-catalogue gaps: the remaining built-in catalogue by @AlexeyShirshov in #283
- MariaDB function-catalogue gaps: the remaining built-in catalogue by @AlexeyShirshov in #284
- SQLite function-catalogue gaps: the remaining built-in catalogue by @AlexeyShirshov in #285
- ClickHouse function-catalogue gaps: the remaining built-in catalogue by @AlexeyShirshov in #286
ORDER BY NULLS FIRST/LAST: portable NULL placement by @AlexeyShirshov in #287IS [NOT] DISTINCT FROM: NULL-safe comparison by @AlexeyShirshov in #288- Savepoints:
SAVEPOINT/ROLLBACK TO/RELEASEinITransactionManagerby @AlexeyShirshov in #289 ToUpper/ToLower(CultureInfo.InvariantCulture)was rejected when the argument was not aConstantExpressionby @AlexeyShirshov in #290avg_over/Avgover an integer column were typed as integers, truncating the average by @AlexeyShirshov in #291Stdev/Stdevp/Var/Varpcrashed on a zero/one-row sample: non-nullable return type over a NULL aggregate by @AlexeyShirshov in #292EF.Functions.Likeslipped past the EF bridge guard by @AlexeyShirshov in #293- Derived source with a non-anonymous projection failed with a misleading "Select must return new anonymous type" by @AlexeyShirshov in #294
is <type>(TypeBinaryExpression) was not translated: the bare operand became the SQL condition by @AlexeyShirshov in #295- A nullable value-type
== null/!= nullrenderedcol = nulland silently returned zero rows by @AlexeyShirshov in #296 - SQL Server:
WithTies()with a non-zeroOFFSETrendered invalid T-SQL by @AlexeyShirshov in #298 - PostgreSQL: an inline string literal containing an apostrophe was not escaped by @AlexeyShirshov in #299
- Core:
From(scalar set-operation command).ToList()threw "Cannot get ctor from System.Int32" by @AlexeyShirshov in #300 - MERGE: expression-based per-column assignments in
ThenUpdate/ThenInsertby @AlexeyShirshov in #301 - Core: a builder aggregate terminal inside a
WHEREpredicate threwInvalidOperationExceptioninstead of a correlated subquery by @AlexeyShirshov in #303 - Core: a correlated reference-navigation hop failed with "variable 'navigation0' … is not defined" by @AlexeyShirshov in #304
- Bulk insert: the remaining linq2db
BulkCopyOptionsclosed by @AlexeyShirshov in #305 - SQLite:
Select(x => x)rendered a truncatedselecstatement whileToCommand()worked by @AlexeyShirshov in #306 - Core: a
ValueTuple.Createprojection leaked a rawArgumentExceptionwithout context by @AlexeyShirshov in #307 - ClickHouse:
Settings(…)+ scalarFirst()renderedSETTINGSbeforeLIMIT 1(Code 62) by @AlexeyShirshov in #308 JoinIntosilently dropped aWheredeclared on the child source by @AlexeyShirshov in #309- Core: an unaliased scalar derived source rendered the bare column name
c0by @AlexeyShirshov in #312 - Core: a bare scalar projection of an enum bypassed the fail-closed guard (
Cannot get ctor from System.DayOfWeek) by @AlexeyShirshov in #313 - Core: projection-form
range_unionov...
1.0.9-rc3
dotnet add package nextorm
dotnet add package nextorm.sqlite
dotnet add package nextorm.sqlserver
dotnet add package nextorm.postgres
dotnet add package nextorm.mysql
dotnet add package nextorm.mariadb
dotnet add package nextorm.clickhouse
What's Changed
- SQL Server:
OPTION (MAXRECURSION n)is no longer dropped when a recursive CTE is hoisted as a mutation source by @AlexeyShirshov in #275 - SQL Server: legacy
WithRecursivewith a distinctUNIONnow fails closed instead of emitting invalid T-SQL by @AlexeyShirshov in #265 - Perf: warm-path
Count/Sumallocations reduced (Count 2979.84 → 408 B/op, Sum 3389.44 → 970 B/op) by @AlexeyShirshov in #243 - Evidence pipeline: canonical global
pdca-dotnetadmission andrequired_rowsfolded into coverage by @AlexeyShirshov in #242 - Uniform cancellation handling during sorting/grouping build by @AlexeyShirshov in #241
- Perf: lower fluent command-construction allocation cost (separate scope/design) by @AlexeyShirshov in #240
- D233/T233 follow-up: stale
file:linereferences refreshed inAPI-NAMING-REVIEW.mdby @AlexeyShirshov in #239 - PDCA skill: no false
incomplete/STOPfrom extra audit-provenance gates by @AlexeyShirshov in #238 - Identifier safety: SQL Server bracket escaping and raw
UNPIVOT/Column<T>names by @AlexeyShirshov in #237 - Build blocker: NU1902/NU1903 for transitive
System.Security.Cryptography.Pkcsresolved by @AlexeyShirshov in #236 - Evidence caveats from T218: E07 certification, E08 allocation oracle, E10 sweep-cap recording by @AlexeyShirshov in #235
- Evidence pipeline hardening: atomic evidence generator and stale-hash lint by @AlexeyShirshov in #234
- Window functions:
Overoverload with a singlepartitionByand a singleWindowOrder(no arrays) by @AlexeyShirshov in #233 - SQL Server
PIVOT/UNPIVOT: typed result projection instead ofTableAliasby name by @AlexeyShirshov in #232 - Join aliases: an aliased chain consumed by a later query no longer drops downstream alias chains by @AlexeyShirshov in #230
- Join aliases: anonymous-projection chain emits a diagnostic instead of invalid C# by @AlexeyShirshov in #229
- Flaky ClickHouse test
FloatNativeParity_GroupedSingleFloat64stabilised by @AlexeyShirshov in #227 ProcedureResult/BatchResult: affected-row count (RecordsAffected) exposed by @AlexeyShirshov in #226- JoinInto: composite-junction M:N documentation delta by @AlexeyShirshov in #225
- SQL formatting:
from/joinon a new line by @AlexeyShirshov in #224 - JoinInto: composite-junction M:N SQL link carrier by @AlexeyShirshov in #223
- Joins: overloads without an explicit source (
Join/LeftJoin/RightJoin/FullJoinby type) by @AlexeyShirshov in #222 - Interceptors: DI registration (generic/factory overloads) by @AlexeyShirshov in #221
- Documentation: new Engine section, Querying dissolved into the Guide by @AlexeyShirshov in #220
- Session/server-identity functions:
SERVER_NAME,HOST_ID/HOST_NAME,APP_NAME,SUSER_NAMEand provider analogues by @AlexeyShirshov in #219 - SQL Server sequences (
NEXT VALUE FOR): missing cross-provider support by @AlexeyShirshov in #218 - Full
DateTimeOffsetsupport:Now/UtcNowand date-part SQL translation by @AlexeyShirshov in #217 - Row locking: split the whole-query lock (
FOR UPDATE) fromFOR UPDATE OFon a specific source by @AlexeyShirshov in #216 - Remove the OneOf dependency by @AlexeyShirshov in #215
- JoinInto: composite keys, composite junction selectors and M:N under single-query by @AlexeyShirshov in #213
- Eager loading: nested level 2+
LoadWithby @AlexeyShirshov in #212 - Eager loading: per-parent
Take/Skipcorrelated child query by @AlexeyShirshov in #211 - Eager loading: explicit strategy selection and auto-dispatcher by @AlexeyShirshov in #209
- Uniform cancellation handling during projection build by @AlexeyShirshov in #207
Deferred (accepted limitations)
- Structural CTE graph construction path (COW/shared description): allocations improved, but time did not meet the ≤1.00× bar on any variant — reverted by @AlexeyShirshov in #297
- Warm CTE/recursive CTE allocation residual accepted (Cte 1.18–1.22×, RecursiveCte 1.59–1.61×, time 0.55–0.61×,
*_Warm_Reused0 B) by @AlexeyShirshov in #244 - Command-path diagram: edit applied directly, no separate tracking needed by @AlexeyShirshov in #228
- Eager-load ordering guarantee folded into #211 by @AlexeyShirshov in #210
- M12 #3 cached-path parity: allocation criterion not met; remainder moved to #240 by @AlexeyShirshov in #201
Notes
- No intentional public API removals. Consumer-visible behaviour: canonical
from/joinlayout (#224), fail-closed legacyWithRecursive(#265), corrected identifier escaping (#237), andOPTION (MAXRECURSION)preserved (#275).
Full Changelog: v1.0.9-rc2...1.0.9-rc3
1.0.9-rc2
dotnet add package nextorm
dotnet add package nextorm.sqlite
dotnet add package nextorm.sqlserver
dotnet add package nextorm.postgres
dotnet add package nextorm.mysql
dotnet add package nextorm.mariadb
dotnet add package nextorm.clickhouse
What's Changed
- JSON streaming Phase 2: nested projections and
Projection<T1,T2>by @AlexeyShirshov in #176 - JSON streaming Phase 3: DB-side JSON fast-path (
FOR JSON/json_agg/JSONEachRow) by @AlexeyShirshov in #177 - JSON streaming: enum support (numeric form and STJ
[JsonConverter]strings) by @AlexeyShirshov in #178 - JSON streaming: partial-output/error policy defined (valid JSON on failure) by @AlexeyShirshov in #179
- JSON streaming: provider-specific column conversion details and validation exception type by @AlexeyShirshov in #180
- SQL Server native JSON: projected
SqlFunctions.Parameter<T>is rendered with the required alias (FOR JSONrestored) by @AlexeyShirshov in #208 - CSV streaming: chunked read for
byte[]fields (bounded memory) by @AlexeyShirshov in #167 - Join aliases: free positional/alias mixing + root alias (
.WithAlias(Alias.X)) by @AlexeyShirshov in #160 - CTE: direct join-family overloads and alias API for
Cte<T>by @AlexeyShirshov in #159 - Source generator: CS0111 signature collision when two alias joins share
Alias.Xwith different projection types (verified supported + regression test) by @AlexeyShirshov in #206 - Fix whole-entity selection from JOIN projections by @AlexeyShirshov in #190
- Mapping: projection folding no longer ignores
Member(SelectExpressionPlanEqualityComparer/RowMapperFactory) by @AlexeyShirshov in #173 BindEntity<T>now registers the entity mapping (typed projections without a priorFrom<T>) by @AlexeyShirshov in #185JoinIntoSpec.IdentitySelectorCacheis cleared byDataContextCache.Clear()by @AlexeyShirshov in #174- Navigation: validate FK uniqueness for OneToOne by @AlexeyShirshov in #170
- Table hints:
TablesInScopeHintspreserved on multi-table DELETE/UPDATE join paths by @AlexeyShirshov in #169 LoadWith: foldAsSingleQueryinto anEagerLoadModeparameter (AsSingleQuery()removed) by @AlexeyShirshov in #184- Provider-specific fluent methods moved out of
EntityBuilderinto provider extensions by @AlexeyShirshov in #191 ToDataReader/ToDataReaderAsync: support SQLite for non-LOB projections by @AlexeyShirshov in #189- V32: navigation over temp-table/TVP sources is deferred (fail-closed) by @AlexeyShirshov in #162
- Comparison benchmarks tier 1: projection, aggregates, paging, streaming + cross-library JSON/CSV by @AlexeyShirshov in #188
- PG/CH dialects
sealed→class: record the public-extensibility decision by @AlexeyShirshov in #153 - ExtremeRow capability DTOs: public read-only construction instead of internal constructors by @AlexeyShirshov in #154
- Re-run Stryker mutation testing for native extreme-row (coverage capture fixed) by @AlexeyShirshov in #151
- Reconcile register finding 25 by @AlexeyShirshov in #157
- JoinInto test-quality debt: hash-inequality checks /
EagerLoadSpec.Assignvisibility by @AlexeyShirshov in #175
Deferred (accepted limitations)
- JoinInto over
As/derived source — rejected now, revisit on demand by @AlexeyShirshov in #171 - Child-collection projection into anonymous/derived form (
NORM.ChildCollection) — deferred by @AlexeyShirshov in #172
Full Changelog: v1.0.9-rc1...v1.0.9-rc2
1.0.9-rc1
dotnet add package nextorm
dotnet add package nextorm.sqlite
dotnet add package nextorm.sqlserver
dotnet add package nextorm.postgres
dotnet add package nextorm.mysql
dotnet add package nextorm.mariadb
dotnet add package nextorm.clickhouse
What's Changed
- ClickHouse: нативная поддержка JSON (
[JsonColumn],JsonDocument,JsonElement) by @AlexeyShirshov in #198 - PostgreSQL: чтение
JsonNodeиз нативныхjson/jsonb-колонок by @AlexeyShirshov in #197 - Raw-row materialization: поддержка PostgreSQL
ROW/composite by @AlexeyShirshov in #194 - SQL Server: паритет скалярных функций с linq2db (metadata / date-part / checksum) by @AlexeyShirshov in #182
- SQLite: полнотекстовый поиск FTS3/FTS4/FTS5 by @AlexeyShirshov in #181
- SQLite: поддержка JSON1 by @AlexeyShirshov in #132
- ClickHouse: экранирование обратных слэшей в идентификаторах by @AlexeyShirshov in #161
- ClickHouse: нативный паритет extreme-row для float/double ключей by @AlexeyShirshov in #150
- ClickHouse: маппинг нативного типа колонки JSON by @AlexeyShirshov in #128
- Version-gates: MariaDB 13 и PostgreSQL FILTER-агрегаты для 9.2/9.3 by @AlexeyShirshov in #141
- PostgreSQL: маппинг нативной колонки
json/jsonbby @AlexeyShirshov in #131 - PostgreSQL: свободный (provider-specific) список колонок by @AlexeyShirshov in #140
ToDataReaderна SQLite by @AlexeyShirshov in #134- Streaming LOB: MySQL/MariaDB и ClickHouse by @AlexeyShirshov in #133
- SQL Server:
OUTPUT INTOв табличную переменную (DECLARE @t TABLE) by @AlexeyShirshov in #127 - Tuple-конструктор
(a, b)на MySQL/MariaDB/SQLite by @AlexeyShirshov in #126 - Tuple
IN/Contains: трансляция и исполнение во всех провайдерах by @AlexeyShirshov in #193 - FTS5 maintenance/control: поверхность команд (
AutoMerge/CrisisMerge/Merge/Optimize/Rebuild/IntegrityCheck) by @AlexeyShirshov in #195 - FTS5 maintenance: тесты на реальном SQLite + документация EN/RU by @AlexeyShirshov in #196
- ClickHouse:
reference→collectionнавигация — принятое ограничение провайдера (явный gate) by @AlexeyShirshov in #163 - SQL Server:
MapColumnExpressionбольше не боксит числовые значения by @AlexeyShirshov in #168 - Fix: скалярный путь
InValuesTranslatorбольше не отравляет plan-cache общегоQueryCommand(stickyCache=false) by @AlexeyShirshov in #199 - Perf: снижены аллокации свежего cached-пути CTE/RecursiveCTE by @AlexeyShirshov in #200
- Fix: PostgreSQL
hstore/ltreeraw-колонки на чистом type-каталоге больше не диагностируются как named composite by @AlexeyShirshov in #202 - PostgreSQL raw-row: авторитетная классификация composite на чистом type-каталоге; единый путь для single-/multi-column by @AlexeyShirshov in #203
- 1.0.9-rc1 by @AlexeyShirshov in #204
Full Changelog: v1.0.9-b...v1.0.9-rc1
1.0.9-b
dotnet add package nextorm
dotnet add package nextorm.sqlite
dotnet add package nextorm.sqlserver
dotnet add package nextorm.postgres
dotnet add package nextorm.mysql
dotnet add package nextorm.mariadb
dotnet add package nextorm.clickhouse
What's Changed
- Неявные навигационные запросы: одиночные связи, многошаговые цепочки, presence-проверки и
AsEntityBuilderby @AlexeyShirshov in #148 - Связи:
JoinIntoдля many-to-many и one-to-one by @AlexeyShirshov in #135 - Алиасы в join: типизированные alias-проекции через source generator (
Alias.Buyerи т.п.) by @AlexeyShirshov in #113 - CTE: типизированные источники с сохранением проекции
Select, включая рекурсивные by @AlexeyShirshov in #146 - CTE: тела UPDATE/DELETE и вынос вложенных CTE в верхний
WITHby @AlexeyShirshov in #136 SelectWhereMax/SelectWhereMin— нативные fast paths PostgreSQLDISTINCT ONи ClickHouseargMaxby @AlexeyShirshov in #144- Join/
.Returning(...): явный терминал удаления и identity-форма для multi-table by @AlexeyShirshov in #145 - API:
Create…Builderдля DML/batch и альтернативные query-фабрики by @AlexeyShirshov in #147 - Хинты: табличные (
WITH) на присоединённых таблицах, fluent API и параметризация by @AlexeyShirshov in #130 - Потоковая выдача данных в
Stream— JSON и RFC 4180 CSV без материализации by @AlexeyShirshov in #112 ProcedureResult: стриминг нескольких result set'ов (гетерогенный курсор) by @AlexeyShirshov in #118- Raw SQL как шаг батча (
BatchBuilder.Raw) и params-формаExecuteRaw/ExecuteProcedureby @AlexeyShirshov in #119 - Глобальные фильтры: мост keyed-фильтров EF Core 10, цель INSERT/MERGE/UPSERT,
FromSql/сырые источники by @AlexeyShirshov in #125 - In-memory:
PrepareFromSqlдля сырого SQL и источники табличных функций by @AlexeyShirshov in #139 - Dynamic columns: write-side в in-memory, per-key конвертеры и JSON by @AlexeyShirshov in #137
- Унификация обхода result-set:
BatchResult/ProcedureResultнапрямую перечисляемы,ReadSetsудалён by @AlexeyShirshov in #186 - Новые страницы EN + RU: глава 28 «Потоковая выдача данных», глава 29 «Неявные навигационные запросы», «Нативные стратегии крайней строки», «Мост фильтров EF Core»
- Удалены из общего API
Final(),PreWhere(predicate)иSettings(("key", "value"), ...)by @AlexeyShirshov in #122 - 1.0.9-b by @AlexeyShirshov in #192
Full Changelog: v1.0.9-a...v1.0.9-b
1.0.9-a
dotnet add package nextorm
dotnet add package nextorm.sqlite
dotnet add package nextorm.sqlserver
dotnet add package nextorm.postgres
dotnet add package nextorm.mysql
dotnet add package nextorm.mariadb
dotnet add package nextorm.clickhouse
What's Changed
- Навигационные свойства и связи: декларативные O2M/M2O,
JoinInto, дочерние коллекции by @AlexeyShirshov in #105 - Eager loading графа —
LoadWith/Include(split- и single-query,AsSingleQuery) by @AlexeyShirshov in #95 - Глобальные фильтры запросов (fluent + атрибут, keyed, selective
IgnoreFilters, DML и INSERT/MERGE-валидация) by @AlexeyShirshov in #67 - Интеграция с EF Core — пакет
nextorm.entityframeworkcore(UseNextOrm, DI, shared transactions) by @AlexeyShirshov in #61 - Динамические колонки (store): чтение и запись, INSERT/UPDATE/MERGE рендерят ключи словаря как колонки by @AlexeyShirshov in #94
- Потоковое чтение LOB: серверный чанкинг (MySQL/MariaDB), аксессоры именованных колонок и стрим-проекции by @AlexeyShirshov in #100
As<TResult>— проекция join в пользовательский тип и снятие потолка арности by @AlexeyShirshov in #76- Новые страницы EN + RU: «Связи», «Eager loading», «Глобальные фильтры запросов», «Интеграция с EF Core», «Логирование», глава 27 «Динамические колонки»; перенумерация глав руководства
- 1.0.9-a by @AlexeyShirshov in #142
Full Changelog: v1.0.8-b...v1.0.9-a
1.0.8-b
dotnet add package nextorm
dotnet add package nextorm.sqlite
dotnet add package nextorm.sqlserver
dotnet add package nextorm.postgres
dotnet add package nextorm.mysql
dotnet add package nextorm.mariadb
dotnet add package nextorm.clickhouse
What's Changed
- Multi-resultset support by @AlexeyShirshov in #25
- BLOB/CLOB support by @AlexeyShirshov in #27
- Хранимые процедуры и функции (вызов, output-параметры, несколько result-set) by @AlexeyShirshov in #70
- Table-valued parameters (TVP) by @AlexeyShirshov in #73
- Паритет опций bulk copy / bulk insert by @AlexeyShirshov in #92
- Command timeout (per-context / per-query) by @AlexeyShirshov in #93
- Варианты хинтов — join / subquery / tables-in-scope by @AlexeyShirshov in #96
- Управление кэшем планов/запросов (ClearCache, disable, sliding expiration) by @AlexeyShirshov in #97
- Комментарий-метка запроса (TagQuery) by @AlexeyShirshov in #98
- Per-query переопределение источника (table/schema/database/server,
WithTableExpression) by @AlexeyShirshov in #99 - Новая глава руководства EN + RU: потоковое чтение больших объектов (BLOB/CLOB)
- 1.0.8-b by @AlexeyShirshov in #103
Full Changelog: v1.0.7-b...v1.0.8-b
1.0.7-b
Release notes
dotnet add package nextorm
dotnet add package nextorm.sqlite
dotnet add package nextorm.sqlserver
dotnet add package nextorm.postgres
dotnet add package nextorm.mysql
dotnet add package nextorm.mariadb
dotnet add package nextorm.clickhouse
What's Changed
OUTPUT INTO, несколько result-set'ов, upsert-with-output by @AlexeyShirshov in #15- Value converters —
EnumToStringConverter, конвертеры в предикатах и проекциях by @AlexeyShirshov in #31 - Динамическая схема результата (ClickHouse
values(), PostgreSQLjsonb_to_record(set)) by @AlexeyShirshov in #63 - JSON-колонка ↔ CLR-объект (авто-сериализация свойства) by @AlexeyShirshov in #64
- PostgreSQL range-типы и
Overlaps(&&) by @AlexeyShirshov in #66 - SQL Server 2025 —
regexp_like/regexp_replaceby @AlexeyShirshov in #85 - Портативный range как пара колонок —
[RangeColumns]by @AlexeyShirshov in #86 - Скалярные функции: кросс-провайдерный фасад
SqlFunctions.Sqlи пробелы по провайдерам by @AlexeyShirshov in #87 - Value converters — фаза 2 и JSON-колонки by @AlexeyShirshov in #88
- In-memory функции, структурный ключ плана запроса, dictionary lookup by @AlexeyShirshov in #89
- Спеки, регистры аудита, документация EN + RU by @AlexeyShirshov in #90
- Новые главы руководства EN + RU: конвертеры значений и JSON-колонки, range-колонки
- 1.0 beta by @AlexeyShirshov in #91
Full Changelog: v1.0.6-alpha...v1.0.7-b