Repository navigation
- Add Enumerable
order,orderDescending,asEnumerable,longCount,
tryGetNonEnumeratedCount,cast,ofType,sequenceandinfiniteSequence. - Support indexed callbacks in
select,where,selectMany,skipWhileand
takeWhile, including Queryable closure translation throughIndexExpression. - Add Enumerable
selectManyandgroupByresult selectors. - Expand Queryable with append/prepend, reverse, default-if-empty, while/tail
operations, key-based set operations, min/max-by, right joins, identity ordering,
element access, count-by, aggregation and grouped aggregation. - Add
Queryable::asQueryable()andEnumerable::asQueryable()for deferred
in-memory queries, preserving an existing IQueryable and its provider. - Translate closures for Queryable ordering, grouping, aggregate selectors,
terminal predicates and join keys. Aggregation supports accumulator closures,
explicit seeds and an optional final result selector. - Match .NET paging behavior for nonpositive
skipandtakecounts. Ignore null
values in Enumerable averages; nonempty all-null sequences return null, while
empty Enumerable averages continue to throwUnderflowException. - Document PHP numeric/type semantics, closure restrictions and provider support.
SQL/custom providers must implement the new operations and expression nodes or
reject them explicitly; no automatic client-side fallback is introduced. - Expand validation to 383 tests and 1,411 assertions, with CI on PHP 8.3–8.5.
Compatibility notes: custom implementations of IEnumerable and IQueryable
must implement the added methods. Enumerable average() now has a nullable return
type. cast() checks types without coercion and rejects null; sequence generators
use PHP int|float limits. aggregateBy() currently supports fixed seeds only.