Skip to content

Restore WithProjection(LambdaExpression) and add nav isNull - #1407

Merged
SimonCropp merged 1 commit into
mainfrom
restore-lambda-projection-and-nav-isnull
Sep 11, 2026
Merged

Restore WithProjection(LambdaExpression) and add nav isNull#1407
SimonCropp merged 1 commit into
mainfrom
restore-lambda-projection-and-nav-isnull

Conversation

@SimonCropp

Copy link
Copy Markdown
Owner

Two gaps that 35.0.0 left, both found while upgrading a downstream API.

WithProjection only took Expression<Func<TSource, TProjection>>, so a projection built by reflection or Expression.Lambda had no route in: IncludeAppender is internal, so its public SetProjectionMetadata is unreachable. Adds the LambdaExpression overload back alongside the generic one. Overload resolution prefers the generic for lambdas and for the old cast form, so no existing call site changes meaning, and both share the identity-projection check.

A reference navigation could not be tested for null. v34's string path said {path: "nav", comparison: equal}, and WhereExpression still builds that predicate, but the generated nested where has no comparison of its own, and {nav: {id: {equal: null}}} unboxed null into a non nullable Guid rather than emitting IS NULL. WhereGraph gains isNull, Prefix resolves the navigation-only path, and TypeConverter treats null as a comparison a reference typed member can take. isNull at the root of a where has no navigation to bind to and reports that.

Version 35.1.0.

Two gaps that 35.0.0 left, both found while upgrading a downstream API.

WithProjection only took Expression<Func<TSource, TProjection>>, so a
projection built by reflection or Expression.Lambda had no route in:
IncludeAppender is internal, so its public SetProjectionMetadata is
unreachable. Adds the LambdaExpression overload back alongside the
generic one. Overload resolution prefers the generic for lambdas and for
the old cast form, so no existing call site changes meaning, and both
share the identity-projection check.

A reference navigation could not be tested for null. v34's string path
said {path: "nav", comparison: equal}, and WhereExpression still builds
that predicate, but the generated nested where has no comparison of its
own, and {nav: {id: {equal: null}}} unboxed null into a non nullable
Guid rather than emitting IS NULL. WhereGraph<T> gains isNull, Prefix
resolves the navigation-only path, and TypeConverter treats null as a
comparison a reference typed member can take. isNull at the root of a
where has no navigation to bind to and reports that.

Version 35.1.0.
@SimonCropp SimonCropp added this to the 35.1.0 milestone Sep 11, 2026
@SimonCropp
SimonCropp merged commit c5ae3ac into main Sep 11, 2026
4 of 6 checks passed
@SimonCropp
SimonCropp deleted the restore-lambda-projection-and-nav-isnull branch September 11, 2026 03:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant