Skip to content

Releases

1.0.9

Choose a tag to compare

@AlexeyShirshov AlexeyShirshov released this 11 Nov 15:01
928eae2

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
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 with NullReferenceException or rendering invalid SQL (#386).
  • JSON streaming: a decimal projection over a float/REAL column no longer serializes the binary expansion
    (12.3399… instead of 12.34) — streamed and materialized values now agree (#388).
  • SelectGroupHaving types 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.0 and net11.0) instead of one (#387).

What's Changed

  • Public API: the surface is frozen and tracked by PublicApiAnalyzers + PublicAPI.Shipped.txt in 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 on net11.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 decimal projection 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.entityframeworkcore added 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 clang and 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-x64 and 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/SelectGroupHaving is not supported by design — the in-memory provider throws NotSupportedException, so those operators need a real database (extensions guide)
  • PackageValidationBaselineVersion is not set yet: a stable baseline can only be declared once 1.0.9 is on nuget.org, so the first package validation against it happens in 1.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

1.0.9-rc5 Pre-release
Pre-release

Choose a tag to compare

@AlexeyShirshov AlexeyShirshov released this 08 Nov 05:58
8c48420

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
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/SelectWhereMax and
    SelectGroup/SelectGroupHaving live here, implemented on public query components (#362, #365,
    #368). The in-core copies are frozen as SelectWhereMinOld/SelectWhereMaxOld and scheduled for
    removal; SelectGroup is gone from core.
  • Public preparation contract — IQueryComponent + WithComponent,
    IQueryPreparationDescriptor, QueryPreparationContribution and ExclusiveGrouping. 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/SelectWhereMax moved to nextorm.extensions (four overloads, no *Ex aliases); the built-in core methods became SelectWhereMinOld/SelectWhereMaxOld. A consumer needs a reference to nextorm.extensions, otherwise the previous calls no longer compile (#365)
  • SelectGroup was removed from core and re-implemented in nextorm.extensions together with the new SelectGroupHaving; 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.extensions had never been published, so the publish job 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/SelectWhereMax proven on public query components outside core by @AlexeyShirshov in #362
  • nextorm.extensions: SelectWhereMinEx/SelectWhereMaxEx on public query components (legacy path frozen as baseline) by @AlexeyShirshov in #365
  • SelectGroup/SelectGroupHaving in nextorm.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/INTERSECT allocations 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/Min portable lowering revisited (GROUP BY / join-back strategy) by @AlexeyShirshov in #302
  • Perf: lower allocations in the PG DelayPercentilesByModel example by @AlexeyShirshov in #267
  • Perf: lower allocations in the PG AircraftDelayChains example by @AlexeyShirshov in #268
  • Perf: lower allocations in the PG AirportOnTimePerformance example by @AlexeyShirshov in #269
  • Perf: lower allocations in the CH Funnel example by @AlexeyShirshov in #270
  • Perf: lower allocations in the CH Sessions example by @AlexeyShirshov in #272
  • Perf: lower allocations in the CH SessionDepth example by @AlexeyShirshov in #273
  • Perf: lower allocations in the CH RollingActivity example 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/xxh32 are no longer advertised — the server has no such functions by @AlexeyShirshov in #352
  • Core: hand-written ManyToOne metadata with FK.Count > PrincipalKey.Count reports a named diagnostic instead of IndexOutOfRangeException by @AlexeyShirshov in #353
  • ClickHouse: group_array over a Tuple element renders a valid Array(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.X by @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_Live no longer depends on row order of an unordered UNION ALL (ClickHouse flake) by @AlexeyShirshov in #369

Known limitations

  • NativeAOT is partial and experimental: SQLite, net10.0, linux-x64 only. 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 Retention example 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

1.0.9-rc4 Pre-release
Pre-release

Choose a tag to compare

@AlexeyShirshov AlexeyShirshov released this 29 Oct 17:37
a331aae

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

Breaking changes (prerelease)

  • Avg/avg_over over an integer column now returns double? / WindowFunction<double?> instead of an integer type — the silent truncation is gone (#291)
  • Prepare(bool nonStreamUsing, CancellationToken) is replaced by Prepare(PrepareOptions, CancellationToken) (per-connection command cache by default); DbCommand and LastRowCount are removed from the prepared API (#333)
  • ITransactionManager gains CreateSavepoint / RollbackToSavepoint / ReleaseSavepoint as default interface members (#289)
  • MERGE supports expression-based per-column assignments in ThenUpdate / ThenInsert (#301)
  • Behavioural changes without signature changes: == null / != null on a nullable value type renders IS NULL / IS NOT NULL (#296); WithTies() with a non-zero OFFSET fails closed on SQL Server (#298); string-literal escaping and backslash/NUL modes (#299, #327); plan identity includes ApplySource (#316); raw ArgumentException/InvalidOperationException replaced by documented NotSupportedException and contextual QueryPreparationException (#293–#295, #307, #313–#315, #343); ClickHouse ErrorCode -1 is 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: LoadWith for every relationship and implicit collection projections by @AlexeyShirshov in #249
  • Composite relationships: public declaration, SQL navigations and metadata-driven LoadWith by @AlexeyShirshov in #251
  • ClickHouse: array_except rendered the non-existent arrayExcept by @AlexeyShirshov in #252
  • ClickHouse: bit_length/octet_length returned UInt64 but were declared int? (InvalidCastException) by @AlexeyShirshov in #253
  • ClickHouse: md5/sha1/sha256/sha512 digests were decoded as lossy UTF-8 strings by @AlexeyShirshov in #254
  • ClickHouse: date_diff returns Int64 but was declared int? (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_sort rendered 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 timefromparts result (time) can be materialised into TimeSpan by @AlexeyShirshov in #259
  • PostgreSQL 17: array_reverse/array_sort/uuidv7 were 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 ambiguous unknown -> unknown operator by @AlexeyShirshov in #263
  • PostgreSQL: make_interval with months can be materialised into TimeSpan by @AlexeyShirshov in #264
  • SQL Server: composable DML OUTPUT — INSERT/UPDATE/DELETE/MERGE output 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: soundex is 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 (and uuid_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 #287
  • IS [NOT] DISTINCT FROM: NULL-safe comparison by @AlexeyShirshov in #288
  • Savepoints: SAVEPOINT / ROLLBACK TO / RELEASE in ITransactionManager by @AlexeyShirshov in #289
  • ToUpper/ToLower(CultureInfo.InvariantCulture) was rejected when the argument was not a ConstantExpression by @AlexeyShirshov in #290
  • avg_over/Avg over an integer column were typed as integers, truncating the average by @AlexeyShirshov in #291
  • Stdev/Stdevp/Var/Varp crashed on a zero/one-row sample: non-nullable return type over a NULL aggregate by @AlexeyShirshov in #292
  • EF.Functions.Like slipped 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 / != null rendered col = null and silently returned zero rows by @AlexeyShirshov in #296
  • SQL Server: WithTies() with a non-zero OFFSET rendered 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/ThenInsert by @AlexeyShirshov in #301
  • Core: a builder aggregate terminal inside a WHERE predicate threw InvalidOperationException instead 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 BulkCopyOptions closed by @AlexeyShirshov in #305
  • SQLite: Select(x => x) rendered a truncated selec statement while ToCommand() worked by @AlexeyShirshov in #306
  • Core: a ValueTuple.Create projection leaked a raw ArgumentException without context by @AlexeyShirshov in #307
  • ClickHouse: Settings(…) + scalar First() rendered SETTINGS before LIMIT 1 (Code 62) by @AlexeyShirshov in #308
  • JoinInto silently dropped a Where declared on the child source by @AlexeyShirshov in #309
  • Core: an unaliased scalar derived source rendered the bare column name c0 by @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_union ov...
Read more

1.0.9-rc3

1.0.9-rc3 Pre-release
Pre-release

Choose a tag to compare

@AlexeyShirshov AlexeyShirshov released this 20 Oct 08:13
15a4d0b

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

  • 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 WithRecursive with a distinct UNION now fails closed instead of emitting invalid T-SQL by @AlexeyShirshov in #265
  • Perf: warm-path Count/Sum allocations reduced (Count 2979.84 → 408 B/op, Sum 3389.44 → 970 B/op) by @AlexeyShirshov in #243
  • Evidence pipeline: canonical global pdca-dotnet admission and required_rows folded 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:line references refreshed in API-NAMING-REVIEW.md by @AlexeyShirshov in #239
  • PDCA skill: no false incomplete/STOP from 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.Pkcs resolved 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: Over overload with a single partitionBy and a single WindowOrder (no arrays) by @AlexeyShirshov in #233
  • SQL Server PIVOT/UNPIVOT: typed result projection instead of TableAlias by 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_GroupedSingleFloat64 stabilised 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/join on 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/FullJoin by 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_NAME and provider analogues by @AlexeyShirshov in #219
  • SQL Server sequences (NEXT VALUE FOR): missing cross-provider support by @AlexeyShirshov in #218
  • Full DateTimeOffset support: Now/UtcNow and date-part SQL translation by @AlexeyShirshov in #217
  • Row locking: split the whole-query lock (FOR UPDATE) from FOR UPDATE OF on 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+ LoadWith by @AlexeyShirshov in #212
  • Eager loading: per-parent Take/Skip correlated 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_Reused 0 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/join layout (#224), fail-closed legacy WithRecursive (#265), corrected identifier escaping (#237), and OPTION (MAXRECURSION) preserved (#275).

Full Changelog: v1.0.9-rc2...1.0.9-rc3

1.0.9-rc2

1.0.9-rc2 Pre-release
Pre-release

Choose a tag to compare

@AlexeyShirshov AlexeyShirshov released this 10 Oct 18:54
5802514

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

  • 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 JSON restored) 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.X with 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 prior From<T>) by @AlexeyShirshov in #185
  • JoinIntoSpec.IdentitySelectorCache is cleared by DataContextCache.Clear() by @AlexeyShirshov in #174
  • Navigation: validate FK uniqueness for OneToOne by @AlexeyShirshov in #170
  • Table hints: TablesInScopeHints preserved on multi-table DELETE/UPDATE join paths by @AlexeyShirshov in #169
  • LoadWith: fold AsSingleQuery into an EagerLoadMode parameter (AsSingleQuery() removed) by @AlexeyShirshov in #184
  • Provider-specific fluent methods moved out of EntityBuilder into 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.Assign visibility 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

1.0.9-rc1 Pre-release
Pre-release

Choose a tag to compare

@AlexeyShirshov AlexeyShirshov released this 07 Oct 10:18
5412f3a

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

  • 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/jsonb by @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 (sticky Cache=false) by @AlexeyShirshov in #199
  • Perf: снижены аллокации свежего cached-пути CTE/RecursiveCTE by @AlexeyShirshov in #200
  • Fix: PostgreSQL hstore/ltree raw-колонки на чистом 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

1.0.9-b Pre-release
Pre-release

Choose a tag to compare

@AlexeyShirshov AlexeyShirshov released this 05 Oct 17:53
815e012

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

  • Неявные навигационные запросы: одиночные связи, многошаговые цепочки, presence-проверки и AsEntityBuilder by @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 в верхний WITH by @AlexeyShirshov in #136
  • SelectWhereMax/SelectWhereMin — нативные fast paths PostgreSQL DISTINCT ON и ClickHouse argMax by @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/ExecuteProcedure by @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

1.0.9-a Pre-release
Pre-release

Choose a tag to compare

@AlexeyShirshov AlexeyShirshov released this 29 Sep 18:37
624dce0

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

  • Навигационные свойства и связи: декларативные 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

1.0.8-b Pre-release
Pre-release

Choose a tag to compare

@AlexeyShirshov AlexeyShirshov released this 27 Sep 09:13
b6baa0c

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

  • 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

1.0.7-b Pre-release
Pre-release

Choose a tag to compare

@AlexeyShirshov AlexeyShirshov released this 25 Sep 18:24
5d9b8d8

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(), PostgreSQL jsonb_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_replace by @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