Nextorm - high performance zero-sql object-relational mapping (ORM) library
Documentation
Getting started
Engine
Relationships
- Relationships and single-query loading
- Implicit navigation queries
- Eager loading child collections
- Per-parent paging in eager loading
Guide
- Query sources
- Projections
- Filtering (WHERE)
- Joins
- Grouping and aggregates
- Sorting and paging
- Subqueries
- Set operations
- SELECT DISTINCT
- Common table expressions (CTE)
- Window functions
- User-defined functions
- Table-valued functions
- Raw SQL
- Query hints
- JSON support across providers
- Data modification (INSERT)
- Data modification (DELETE)
- Data modification (UPDATE)
- Materializing a query into a table
- Data merging (MERGE / upsert)
- Bulk insert
- Transactions
- Duration (TimeSpan) columns
- Executing statements in one batch
- Optimistic concurrency and change tracking
- Range columns (pair of scalar columns)
- Streaming large objects (BLOB/CLOB)
- Dynamic columns
- Streaming data to a Stream
- Provider-specific features
Infrastructure
Scalar functions
- Overview
- String functions
- Math functions
- Date and time
- Conditional and conversion helpers
- Aggregates
- Arrays
- JSON and XML
- Provider reference
- System functions
- Sequences and UUID generators
Connecting providers
Comparisons
Advanced
- Global query filters
- Entity Framework Core integration
- Limitations and out-of-scope features
- Native extreme-row strategies
- Extensibility: custom SQL dialects and renderers
- API reference
Русская документация
Полное руководство на английском: Getting started · Guide · Connecting providers. Русский перевод в работе.
Overview
Nextorm perform two main functions:
- Generate SQL code
- Map relational data into language (or rather a framework) structures such as classes, primitive types, arrays, lists, etc.
Nextorm uses protocol-level libraries (for example, SqlClient for Microsoft SQL Server or SQLite for SQLite) and designed to create a high performance data access layer independent of SQL and specific RDBMS.
Status
The current status (1.0.9) is the first stable release: the public API surface is frozen and tracked from this version, and the packages target .NET 10 and .NET 11.
Installation
- from cli
dotnet add package nextorm - from package manager
Install-Package nextorm
The 1.0.9 release is stable, so the --prerelease flag is no longer needed; previews
(1.0.10-a.x and later) still require it.
To add specific database provider use the following:
dotnet add package nextorm.sqlserverdotnet add package nextorm.sqlitedotnet add package nextorm.postgresdotnet add package nextorm.mysqldotnet add package nextorm.mariadbdotnet add package nextorm.clickhouse
Optional packages: nextorm.extensions (query components: SelectGroup/SelectGroupHaving) and
nextorm.entityframeworkcore (run nextorm queries over an existing EF Core DbContext).
In-memory provider is built-in in core library.
Query reuse
There are two independent ways to avoid re-building a query plan on every execution: the implicit plan
cache (used automatically by EntityBuilder/QueryCommand terminals) and explicit Prepare returning an
IPreparedQueryCommand<TResult>.
They differ in cost, lifetime and thread-safety rules. Which one to use, what each one costs per call and its limitations are covered in the plan cache and reuse guide.
Releases
1.0.9
First stable release: the public API surface is frozen and tracked, the packages multi-target .NET 10 and .NET 11, and the EF Core bridge reaches nuget.org.
- .NET 11: the packages multi-target
net10.0;net11.0, tests/benchmarks/examples run onnet11.0, the toolchain moves to the .NET 11 SDK - Public API is frozen and tracked:
PublicApiAnalyzers+PublicAPI.Shipped.txtin every package, RS0016/RS0017 fail the build - Joins without
From(...): by entity type and by table name across all seven operators - Set operations: the right operand can come from an entity selector instead of a prebuilt query
- Core:
From(string)and the string-table join overloads reject null/empty/whitespace table names instead of failing later - JSON streaming: a
decimalprojection over a float/REAL column no longer serializes the binary expansion (12.3399…vs12.34) SelectGroupHaving: the condition is typed by the projection result, not by the source entity- Build-once query construction: a cached query binds closure values into the published plan instead of rebuilding the statement (M1–M3, measured on
Anyand paged projections) nextorm.entityframeworkcoreis published for the first time — the EF Core bridge was buildable but absent from the release job until now.- Breaking:
ISqlDialect.SupportsAnyAggregatesis renamed toSupportsAnyLastAggregate(the flag gates onlyany_last), and theSelectGroupHavingcondition is now typed by the projection result (#53, #380).
1.0.9-rc5
- NativeAOT: объявлена частичная поддержка (SQLite, .NET 11 /
linux-x64); нативный раннер публикуется и исполняется в CI, остаток — #370 - Warm
EXCEPT/INTERSECT: аллокации приближены к linq2db (принятый остаток) - JSON streaming: пропускная способность на 10k строк доведена до паритета с linq2db
- CSV-терминал больше не пересобирает план колонок на каждый экспорт
- Снижены аллокации примера PG DelayPercentilesByModel
- Снижены аллокации примеров PG AircraftDelayChains
- Снижены аллокации примера PG AirportOnTimePerformance
- Снижены аллокации примера CH Funnel
- Снижены аллокации примера CH Sessions
- Снижены аллокации примера CH SessionDepth
- Снижены аллокации примера CH RollingActivity
SelectWhereMax/Min: пересмотрена портативная lowering-стратегия (GROUP BY / join-back)- JSON streaming: noise-robust ratio-oracle и парная приёмка в одной сессии
- План-кэш: хэш/фингерпринт мемоизируются на версию описания (warm path)
QueryCommand.Clone()больше не копирует пустые коллекции- Build-once query construction (lazy descriptor chain): эпик закрыт как кандидат без расписания
- MariaDB 11.4:
xxh3/xxh32больше не рекламируются — серверных функций нет - Core: рукописные
ManyToOne-метаданные сFK.Count > PrincipalKey.Countдают именную диагностику вместоIndexOutOfRangeException - ClickHouse:
group_arrayпо элементуTupleрендерит валидныйArray(Nullable(Tuple)) - Core: составной ключ
OrderBy(p => new { … })раскрывается в колонки, а не склеивается в невалидный SQL - Join aliases: CTE-дескриптор из aliased-цепочки больше не теряет
Alias.X - Публичные query-компоненты:
SelectWhereMin/Maxдоказаны вне core; декларативный механизм подготовки запросов (IQueryPreparationDescriptor,QueryPreparationContribution) - Raw pre-preparation recipe теперь применим к derived subquery-источникам — свежий вызов больше не платит полный prepare
- Integration branch coverage поднят с 74.4 % до 75.6 %; порог CI
74 → 75 nextorm.extensions:SelectWhereMin/SelectWhereMaxна публичных query-компонентах (legacy-путь заморожен как baseline)SelectGroup/SelectGroupHavingвnextorm.extensions; накладные расходы компонентных операторов измерены и приняты- Тесты:
T300 NullableScalarMaterialize_Liveбольше не зависит от порядка строкUNION ALL(ClickHouse flake) - Принятые ограничения (закрыты как
not_planned): raw readerToDataReaderмедленнее linq2db, пример CH Retention всё ещё аллоцирует 3.02× linq2db, NativeAOT parity — остаток вынесен в #370, трекинг SelectGroup в extensions — выполнен в рамках #362/#368.
1.0.9-rc4
- Примеры: типизированные CTE и именованные алиасы во всех join
- SQL Server live-scope скаляры: открыты 7 исключений
#182(CURRENT_REQUEST_ID,XACT_STATE,SCOPE_IDENTITY, …) - Metadata-driven SQL loading:
LoadWithдля всех связей и неявные проекции коллекций - Составные связи: публичное объявление, SQL-навигации и metadata-driven
LoadWith - ClickHouse:
array_exceptбольше не рендерится как несуществующийarrayExcept - ClickHouse:
bit_length/octet_lengthобъявлены какint?, но возвращаютUInt64(InvalidCastException) - ClickHouse:
md5/sha1/sha256/sha512больше не декодируются как lossy UTF-8 строки - ClickHouse:
date_diffобъявлен какint?, но возвращаетInt64(InvalidCastException) - ClickHouse:
date_add("century", n, …)больше не даёт неверную дату - ClickHouse:
map_filter/map_apply/map_all/map_exists/map_sortрендерят допустимый тип аргумента - SQL Server:
quotename(value, quote_character)больше не рендерит незакрытый строковый литерал - SQL Server: результат
timefromparts(time) материализуется вTimeSpan - PostgreSQL 17:
array_reverse/array_sort/uuidv7больше не рекламируются — серверных функций нет - PostgreSQL:
sha256(byte[])больше не биндит массив как целочисленный параметр - PostgreSQL:
log(base, x)рендерится в существующую серверную перегрузку - PostgreSQL:
json_get(object?, key)больше не даёт неоднозначныйunknown -> unknown - PostgreSQL:
make_intervalс месяцами материализуется вTimeSpan - SQL Server: composable DML
OUTPUT—INSERT/UPDATE/DELETE/MERGEoutput как queryable-источник - ClickHouse: функции, возвращающие массивы, объявляют типы элементов, которые реально отдаёт драйвер
- ClickHouse: higher-order функции над array-колонкой больше не падают с «variable x is not defined»
- SQLite:
soundexбольше не рекламируется — серверной функции нет - Коррелированный
LongCount()возвращает счёт по строке, а не 1 - MariaDB:
months_between/to_date/to_number(иuuid_v4) больше не рекламируются на 11.4 - Пробелы функций PostgreSQL — оставшийся каталог built-in функций
- Пробелы функций SQL Server — оставшийся каталог built-in функций
- Пробелы функций MySQL — оставшийся каталог built-in функций
- Пробелы функций MariaDB — оставшийся каталог built-in функций
- Пробелы функций SQLite — оставшийся каталог built-in функций
- Пробелы функций ClickHouse — оставшийся каталог built-in функций
ORDER BY NULLS FIRST/LAST— переносимое размещение NULLIS [NOT] DISTINCT FROM— NULL-безопасное сравнение- Savepoints —
SAVEPOINT/ROLLBACK TO/RELEASEвITransactionManager ToUpper/ToLower(CultureInfo.InvariantCulture)больше не отклоняются, когда аргумент — не константаAvg/avg_overнад целочисленной колонкой больше не усекают среднее до целогоStdev/Stdevp/Var/Varpбольше не падают на выборке из 0/1 строки: реальныйNullable<T>над NULL-агрегатомEF.Functions.Likeбольше не проскакивает мимо EF-гарда- Derived source с не-анонимной проекцией даёт контекстную диагностику вместо «Select must return new anonymous type»
is <type>(TypeBinaryExpression) транслируется, а не превращается в голое условиеnullable == null/!= nullбольше не рендерится какcol = null(тихие нули)- SQL Server:
WithTies()с ненулевымOFFSETбольше не рендерит невалидный T-SQL - PostgreSQL: апостроф в inline-литерале экранируется (
it''s) - Core:
From(scalar set-operation command).ToList()больше не падает с «Cannot get ctor from System.Int32» - MERGE: expression-based назначения по колонкам в
ThenUpdate/ThenInsert - Core: агрегатный терминал внутри
WHEREдаёт коррелированный подзапрос вместоInvalidOperationException - Core: коррелированный переход по reference-навигации больше не падает с «variable 'navigation0' … is not defined»
- Bulk insert: закрыт остаток linq2db
BulkCopyOptions - SQLite:
Select(x => x)больше не рендерит обрезанныйselec - Core: проекция
ValueTuple.Createбольше не течёт сырымArgumentException - ClickHouse:
Settings(…)+ скалярныйFirst()больше не ставятSETTINGSпередLIMIT 1(Code 62) JoinIntoбольше не теряетWhere, объявленный на дочернем источнике- Core: неалиасенный скалярный derived source больше не рендерит голое
c0 - Core: голая скалярная проекция enum больше не обходит fail-closed гард (
Cannot get ctor from System.DayOfWeek) - Core: projection-form
range_unionнад парой range даёт документированныйNotSupportedException - Core:
SelectWhereMaxпо rawFrom("table")даёт mapped-source гард вместо вводящей в заблуждение диагностики - Core: plan cache учитывает
JoinExpression.ApplySource— APPLY-запросы одной формы больше не переиспользуют чужой SQL - TVF: runtime-фабрики
TvfEntityBuilderи единый lambda API - Join aliases: source-less join может нести алиас (
.Join<T>((l, r) => …, Alias.X)) SelectGroup: автоматическая группировка из одной проекции- Core: коррелированный
CrossApply/OuterApplyпосле join разрешён - MySQL: нативная колонка JSON для
[JsonColumn] - SQL Server 2025 / Azure SQL: нативная колонка
jsonдля[JsonColumn] - SQL literals: режимы backslash для MySQL/MariaDB/ClickHouse и кросс-провайдерная обработка NUL
- ClickHouse integration: 120-секундные
HttpClient-таймауты под давлением памяти хоста - ClickHouse extreme-row parity тест больше не падает детерминированно
JoinInto: перегрузки без явного источника (.JoinInto<TChild>((p, c) => …, p => p.Children))JoinInto: форма по навигации без источника и предиката (metadata-driven ON)string.Format(CultureInfo.InvariantCulture)— сиблинг#290- Core: prepared command — кэш команды per-connection (по умолчанию) +
PrepareOptions;DbCommandиLastRowCountвне API - ClickHouse: связанные nullable-массивы больше не заменяют NULL-элементы значениями по умолчанию
- ClickHouse: nullable string-массивы больше не падают с Code 349
- ClickHouse:
Array(Nullable(Decimal))материализуется вdecimal?[] - ClickHouse:
ErrorCode -1больше не транспортный сигнал — reset, connection-refused и безкодовые HTTP-ошибки различаются - Тесты: process-wide кэши больше не делают прогон чувствительным к порядку и параллелизму
TimeOnly-проекции материализуются- Тестовый тулинг:
dotnet-stryker5.0.0 скоупит мутации под Microsoft.Testing.Platform TimedDictionaryEvictionTestsбольше не зависит от порядка прогона- Join receiver + runtime TVF factory body: дизайнерский отказ вместо сырого
InvalidOperationException - Azure SQL DB/MI/Fabric: определена нативная возможность
json(engine edition) - SQL Server batch capture: два captured read в одном batch больше не перетекают значением фильтра
- SQLite: пред-отменённый
ExecuteRawAsyncбольше не оставляет следующий запрос с обрезанным текстом команды - Тесты: SQLite integration provider больше не делит один scratch-файл на процесс (
SQLITE_BUSY) - Тесты: полный интеграционный прогон больше не теряет ClickHouse-тесты на 120-секундных таймаутах и Code 216
- Core: CTE над named-DTO проекцией больше не теряет алиас колонки по имени свойства (42703)
- Принятые ограничения (закрыты как
not_planned): застой ClickHouse-запроса на полный 120-секундныйHttpClient-таймаут без обращения к серверу — серверная сторона чистая (ни одного запроса дольше 200 мс, трафик в окне застоя падает), клиентская половина шкалы недоступна (обход ретранслятора невозможен), вердиктundetermined— финальный STOP диагностики; #328/#329/#338/#349 закрыли измеримые причины этого класса.
1.0.9-rc3
- SQL Server:
OPTION (MAXRECURSION n)больше не теряется при хоистинге рекурсивного CTE в источник мутации - SQL Server: legacy
WithRecursiveс отличнымUNIONотклоняется fail-closed вместо невалидного T-SQL - Perf: аллокации warm-path
Count/Sumснижены (Count 2979.84 → 408 B/op, Sum 3389.44 → 970 B/op) - Evidence pipeline: канонический global
pdca-dotnetadmission и свёрткаrequired_rowsв покрытие - Единообразная обработка отмены при построении сортировки/группировки
- Perf: снижена стоимость конструирования fluent-команды (отдельный скоуп/дизайн)
- D233/T233: обновлены устаревшие
file:lineвAPI-NAMING-REVIEW.md - PDCA skill: ложные
incomplete/STOPиз-за дополнительных audit-provenance gates больше не возникают - Identifier safety: экранирование скобок в SQL Server и raw-имена
UNPIVOT/Column<T> - Build blocker: устранены NU1902/NU1903 для транзитивного
System.Security.Cryptography.Pkcs - Evidence caveats из T218: сертификация E07, allocation-oracle E08, запись sweep-cap E10
- Evidence pipeline hardening: атомарный генератор evidence и линт устаревших хэшей
- Window functions: перегрузка
Overс однимpartitionByи однимWindowOrder, без массивов - SQL Server
PIVOT/UNPIVOT: типизированная проекция результата вместоTableAliasпо имени - Join aliases: alias-цепочка, использованная в следующем запросе, больше не теряет нижестоящие цепочки
- Join aliases: anonymous-projection цепочка выдаёт диагностику вместо невалидного C#
- Flaky ClickHouse integration test
FloatNativeParity_GroupedSingleFloat64стабилизирован ProcedureResult/BatchResult: раскрыто число затронутых строк (RecordsAffected)- JoinInto: composite-junction M:N — документационный дельта-набор
- SQL-форматирование:
from/joinс новой строки - JoinInto: composite-junction M:N — SQL link carrier
- Джойны: перегрузки без явного источника (
Join/LeftJoin/RightJoin/FullJoinпо типу) - Интерцепторы: регистрация через DI (generic/factory-перегрузки)
- Документация: выделен раздел «Движок» (Engine), Querying растворён в Guide
- Session/server-identity функции:
SERVER_NAME,HOST_ID/HOST_NAME,APP_NAME,SUSER_NAMEи аналоги по провайдерам - SQL Server последовательности (
NEXT VALUE FOR): недостающая кросс-провайдерная поддержка - Полноценная поддержка
DateTimeOffset: трансляцияNow/UtcNowи частей даты - Row locking: разведены лок всего запроса (
FOR UPDATE) иFOR UPDATE OFна конкретный источник - Убрана зависимость OneOf
- TODO: JoinInto — составные ключи, составные junction-селекторы и M:N под single-query
- TODO: eager-load nested — level 2+
LoadWith - TODO: eager-load per-parent
Take/Skip— коррелированная детская выборка - TODO: eager-load strategy — явный выбор стратегии загрузки и авто-диспетчер
- Единообразная обработка отмены при построении проекции
- Принятые ограничения (закрыты как
not_planned): COW/shared-description для структурного CTE-графа (аллокации снижены, но время не уложилось в ≤1.00× — откат), остаточные аллокации warm CTE/RecursiveCte (Cte 1.18–1.22×, RecursiveCte 1.59–1.61×, время 0.55–0.61×,*_Warm_Reused0 B), диаграмма пути команды (правка применена вне трекинга), гарантия порядка eager-load (свёрнуто в #211), паритет cached-пути M12 #3 (остаток вынесен в #240).
1.0.9-rc2
- JSON streaming: вложенные проекции и
Projection<T1,T2> - JSON streaming: DB-side fast-path (
FOR JSON/json_agg/JSONEachRow) - JSON streaming: поддержка
enum(числовая форма и STJ[JsonConverter]-строки) - JSON streaming: определена политика частичного вывода/ошибок (валидный JSON при сбое)
- JSON streaming: провайдерные конвертации колонок и тип исключения валидации
- CSV streaming: чтение
byte[]-колонок чанками (bounded memory) - Join aliases: свободное смешивание positional/alias + алиас корня (
.WithAlias(Alias.X)) - CTE: прямые перегрузки join-семьи и alias-API для
Cte<T> - Source generator: устранён конфликт сигнатур CS0111 при двух alias-join с общим
Alias.X - SQL Server native JSON: проекция
SqlFunctions.Parameter<T>снова рендерится с alias (восстановленFOR JSON) - Fix: выбор всей сущности из JOIN-проекций
- Mapping: fold проекций больше не игнорирует
Member(SelectExpressionPlanEqualityComparer/RowMapperFactory) - Fix:
BindEntity<T>регистрирует маппинг сущности (типизированные проекции без предварительногоFrom<T>) - Fix:
DataContextCache.Clear()очищает кэшJoinIntoSpec.IdentitySelectorCache - Navigation: валидация уникальности FK для OneToOne
- Table hints: сохранение
TablesInScopeHintsна multi-table DELETE/UPDATE join-путях LoadWith: режим eager loading вынесен в параметрEagerLoadMode(AsSingleQuery()удалён)- Provider-specific fluent API вынесен из
EntityBuilderв extensions провайдерных сборок ToDataReader/ToDataReaderAsync: поддержка SQLite для не-LOB проекций- V32: навигация поверх temp-table/TVP-источников отклоняется fail-closed
- Comparison benchmarks tier 1: проекции, агрегаты, пагинация, стриминг + cross-library JSON/CSV
- PG/CH диалекты
sealed→class: зафиксировано решение о публичной расширяемости - ExtremeRow capability DTO: публичная read-only конструкция вместо internal-конструкторов
- Re-run Stryker mutation testing для native extreme-row (фиксация capture)
- Согласована запись finding 25 в регистрах
- JoinInto test-quality debt: проверки hash-inequality / видимость
EagerLoadSpec.Assign - Принятые ограничения (issue закрыты как
not_planned, ревизия по появлении конкретного потребителя): JoinInto поверхAs/derived-источника и child-collection проекция в anonymous/derived-форму
1.0.9-rc1
- ClickHouse: нативная поддержка JSON (
[JsonColumn],JsonDocument,JsonElement) - PostgreSQL: чтение
JsonNodeиз нативныхjson/jsonb-колонок - Raw-row materialization: поддержка PostgreSQL
ROW/composite - SQL Server: паритет скалярных функций с linq2db (metadata / date-part / checksum)
- SQLite: полнотекстовый поиск FTS3/FTS4/FTS5
- SQLite: поддержка JSON1
- ClickHouse: экранирование обратных слэшей в идентификаторах
- ClickHouse: нативный паритет extreme-row для float/double ключей
- ClickHouse: маппинг нативного типа колонки JSON
- Version-gates: MariaDB 13 и PostgreSQL FILTER-агрегаты для 9.2/9.3
- PostgreSQL: маппинг нативной колонки
json/jsonb - PostgreSQL: свободный (provider-specific) список колонок
ToDataReaderна SQLite- Streaming LOB: MySQL/MariaDB и ClickHouse
- SQL Server:
OUTPUT INTOв табличную переменную (DECLARE @t TABLE) - Tuple-конструктор
(a, b)на MySQL/MariaDB/SQLite - Tuple
IN/Contains: трансляция и исполнение во всех провайдерах - FTS5 maintenance/control: поверхность команд (
AutoMerge/CrisisMerge/Merge/Optimize/Rebuild/IntegrityCheck) - FTS5 maintenance: тесты на реальном SQLite + документация EN/RU
- ClickHouse:
reference→collectionнавигация — принятое ограничение провайдера (явный gate) - SQL Server:
MapColumnExpressionбольше не боксит числовые значения - Fix: скалярный путь
InValuesTranslatorбольше не отравляет plan-cache общегоQueryCommand(stickyCache=false) - Perf: снижены аллокации свежего cached-пути CTE/RecursiveCTE
- Fix: PostgreSQL
hstore/ltreeraw-колонки на чистом type-каталоге больше не диагностируются как named composite - PostgreSQL raw-row: авторитетная классификация composite на чистом type-каталоге; единый путь для single-/multi-column
1.0.9-b
- Неявные навигационные запросы: одиночные связи, многошаговые цепочки, presence-проверки и
AsEntityBuilder - Связи:
JoinIntoдля many-to-many и one-to-one - Алиасы в join: типизированные alias-проекции через source generator (
Alias.Buyerи т.п.) - CTE: типизированные источники с сохранением проекции
Select, включая рекурсивные - CTE: тела UPDATE/DELETE и вынос вложенных CTE в верхний
WITH SelectWhereMax/SelectWhereMin— нативные fast paths PostgreSQLDISTINCT ONи ClickHouseargMax- Join/
.Returning(...): явный терминал удаления и identity-форма для multi-table - API:
Create…Builderдля DML/batch и альтернативные query-фабрики - Хинты: табличные (
WITH) на присоединённых таблицах, fluent API и параметризация - Потоковая выдача данных в
Stream— JSON и RFC 4180 CSV без материализации ProcedureResult: стриминг нескольких result set'ов (гетерогенный курсор)- Raw SQL как шаг батча (
BatchBuilder.Raw) и params-формаExecuteRaw/ExecuteProcedure - Глобальные фильтры: мост keyed-фильтров EF Core 10, цель INSERT/MERGE/UPSERT,
FromSql/сырые источники - In-memory:
PrepareFromSqlдля сырого SQL и источники табличных функций - Dynamic columns: write-side в in-memory, per-key конвертеры и JSON
- Унификация обхода result-set:
BatchResult/ProcedureResultнапрямую перечисляемы,ReadSetsудалён - Новые страницы EN + RU: глава 28 «Потоковая выдача данных», глава 29 «Неявные навигационные запросы», «Нативные стратегии крайней строки», «Мост фильтров EF Core»
- Удалены из общего API
Final(),PreWhere(predicate)иSettings(("key", "value"), ...)
1.0.9-a
- Навигационные свойства и связи: декларативные O2M/M2O,
JoinInto, дочерние коллекции - Eager loading графа —
LoadWith/Include(split- и single-query,EagerLoadMode.SingleQuery) - Глобальные фильтры запросов (fluent + атрибут, keyed, selective
IgnoreFilters, DML и INSERT/MERGE-валидация) - Интеграция с EF Core — пакет
nextorm.entityframeworkcore(UseNextOrm, DI, shared transactions) - Динамические колонки (store): чтение и запись, INSERT/UPDATE/MERGE рендерят ключи словаря как колонки
- Потоковое чтение LOB: серверный чанкинг (MySQL/MariaDB), аксессоры именованных колонок и стрим-проекции
As<TResult>— проекция join в пользовательский тип и снятие потолка арности- Новые страницы EN + RU: «Связи», «Eager loading», «Глобальные фильтры запросов», «Интеграция с EF Core», «Логирование», глава 27 «Динамические колонки»; перенумерация глав руководства
- Глава 24 — уточнён диапазон MySQL/MariaDB
TIME
1.0.8-b
- Multi-resultset support
- BLOB/CLOB support
- Хранимые процедуры и функции (вызов, output-параметры, несколько result-set)
- Table-valued parameters (TVP)
- Паритет опций bulk copy / bulk insert
- Command timeout (per-context / per-query)
- Варианты хинтов — join / subquery / tables-in-scope
- Управление кэшем планов/запросов (ClearCache, disable, sliding expiration)
- Комментарий-метка запроса (TagQuery)
- Per-query переопределение источника (table/schema/database/server,
WithTableExpression) - Новая глава руководства EN + RU: потоковое чтение больших объектов (BLOB/CLOB)
1.0.7-beta
OUTPUT INTO, несколько result-set'ов, upsert-with-output- Value converters —
EnumToStringConverter, конвертеры в предикатах и проекциях - Динамическая схема результата (ClickHouse
values(), PostgreSQLjsonb_to_record(set)) - JSON-колонка ↔ CLR-объект (авто-сериализация свойства)
- PostgreSQL range-типы и
Overlaps(&&) - SQL Server 2025 —
regexp_like/regexp_replace - Портативный range как пара колонок —
[RangeColumns] - Скалярные функции: кросс-провайдерный фасад
SqlFunctions.Sqlи пробелы по провайдерам - Value converters и JSON-колонки
- In-memory функции, структурный ключ плана запроса, dictionary lookup
- Новые главы руководства EN + RU: конвертеры значений и JSON-колонки, range-колонки
- Спеки, регистры аудита, документация EN + RU
1.0.6-alpha
- column collation —
Collate(...)в маппинге и запросах - Interceptors —
IQueryInterceptor/IConnectionInterceptor(наблюдение за командами и соединениями) - Трансляция Regex в запросах —
Regex.IsMatch/Regex.Replace - C# string-семантика — ordinal-сравнения, format-спецификаторы, culture
- TimeSpan/interval-колонки и точность дат — атрибут
[Duration] - DDL/DML + читающий запрос в одном SQL-батче (pgbouncer-safe CTAS)
- Кросс-провайдерные строковые/числовые обёртки
SqlFunctions.Sql - ClickHouse: пробелы функций (
lowerUTF8/upperUTF8,trim*,replaceRegexp*,map*, массивы,groupBitmap/sumMap, хэши,generateULID) - MariaDB: пробелы функций (
NVL/NVL2,ADD_MONTHS,MONTHS_BETWEEN,TO_CHAR/TO_DATE/TO_NUMBER,KDF,XXH3,JSON_DETAILED/JSON_COMPACT, последовательности) - MySQL: пробелы функций (
FIND_IN_SET,FIELD,ELT,SUBSTRING_INDEX,STR_TO_DATE,DATE_FORMAT,FROM_UNIXTIME, JSON-mutation,UUID_TO_BIN) - PostgreSQL: пробелы функций (
sha224/384/512,regexp_substr,make_*,age,date_bin,current_setting, последовательности, SQL/JSON) - SQLite: пробелы функций (JSON1,
printf/format,hex/unhex,random/randomblob,quote,typeof,glob,unicode/char,timediff,Math.*) - SQL Server: пробелы функций (
PATINDEX,QUOTENAME,SOUNDEX,DIFFERENCE,TRANSLATE,FORMAT,DATENAME,DATE_BUCKET,HASHBYTES, JSON-агрегаты) - Новые главы руководства EN + RU: длительности (
[Duration]), interceptors, SQL-батчи, оптимистичный параллелизм
1.0.5-alpha
- INSERT: одиночная и многострочная вставка значений и сущностей, возврат сгенерированного ключа
- UPDATE: присваивания по колонкам, фильтр WHERE и обновление сущности по ключу
- DELETE: удаление по предикату и по объявленному ключу
- MERGE: key upsert (ON CONFLICT / ON DUPLICATE KEY) и полный MERGE с WHEN MATCHED / WHEN NOT MATCHED
- Транзакции: созданные nextorm и переданные извне (ADO.NET / EF Core)
- CREATE TABLE ... AS SELECT (CTAS) и временные таблицы
- Массовая вставка (bulk): values / сущности / DataTable, пакетами, с RETURNING / OUTPUT
- Новые главы руководства EN + RU: INSERT/DELETE/UPDATE/MERGE, CTAS, bulk insert, транзакции
1.0.4-alpha
- ClickHouse: закрыт остаток backlog — UInt64 row reader, серверные/кластерные TVF, нативный JSON
- ClickHouse: массивы Array(T)/Tuple — row reader, array-агрегаты и higher-order (lambda) функции
- ClickHouse: join kinds SEMI/ANTI/PASTE — JoinType.Semi/Anti/Paste, SemiJoin/AntiJoin/PasteJoin
- Типизированный доступ к колонке по имени — SqlFunctions.Column
- Полная XML-документация публичного API во всех пакетах
1.0.3.1-alpha
- Hotfix for a regression introduced in 1.0.3-alpha: a derived query whose projection references a
source from a nested command rendered an incomplete column list (invalid SQL, or
Operation is not valid due to the current state of the object). Affected PostgreSQL, SQL Server, MySQL/MariaDB and ClickHouse.
1.0.3-alpha
- Table-valued functions
- Scalar-valued functions
- Table hints
- Benchmark with Dapper and EF
- Новые возможности SQL-генерации
- PostgreSQL support
- MySQL support
- SQL functions
- ClickHouse support
1.0.2-alpha
- Aggregates (count, min, max, avg, sum, stdev, var)
- Grouping (GROUP BY / HAVING)
- Union
- Correlated subqueries
- Custom ExpressionVisitor