v5.6.0
5.6.0 (2026-07-21)
Features
- cassandra: counter columns and IF NOT EXISTS lightweight transactions (f456c5e)
- cassandra: OR-split — partition-pinned OR branches run as parallel native queries (e705fd6)
- core,cassandra,cosmosdb: continuation-token paging over the native paths (7b51e20)
- core,providers: global query filters, OpenTelemetry activities, per-operation consistency/TTL (e99509a)
- core,providers: pushdown+residual engine, Explain, prepared statements (8541a0b)
- core: evaluate parameter-free filter operands at translation time (1d09d11)
- cosmosdb: optimistic concurrency through the document ETag (5555dfd)
- mongodb: reads join the active transaction session (cde1957)
- providers: computed set-based updates via a shared update IR (6b59be1)
- providers: IAsyncEnumerable streaming + MongoDB keyset continuation paging (39faf6b)
⚠️ Upgrade notes
v5.6.0 also corrects provider behaviour — a few changes can surface in code written against 5.4/5.5:
GetFiltered/AllMatchingnow compose (AND) with the options filter on Cassandra instead of replacing it, and never mutate the caller's options.Get/GetAsyncon Cassandra now honourQueryOptions(a non-key options filter without.AllowFiltering()throws with guidance instead of being silently dropped).Include(...)now throws on Cosmos and Cassandra (was silently ignored).- Predicates CQL cannot express (
ORacross columns,!=,NULL, arbitrary shapes) are now gated opt-ins (.AllowClientEvaluation()/.AllowFiltering()) instead of unconditional rejections; a partition-pinnedORruns natively with no opt-in. CosmosReadRepository.Query(protected) changed signature (Func<IQueryable,IQueryable>→Expression<Func<T,bool>>?) — affects derived repositories only..AllowFiltering()no longer occupiesQueryOptions.Tag; Cassandra statements are now prepared (first execution per shape pays one prepare round-trip); MongoDB reads inside an open transaction now see its writes.
Full details and the additive surface: docs/UPGRADING-5.6.md