Skip to content

Commit 88a56bb

Browse files
committed
Fold member access into conditional
Fixes dotnet#34589.
1 parent 47c81a9 commit 88a56bb

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

src/EFCore.InMemory/Query/Internal/InMemoryQueryableMethodTranslatingExpressionVisitor.cs

+10
Original file line numberDiff line numberDiff line change
@@ -1146,6 +1146,16 @@ public Expression Expand(InMemoryQueryExpression queryExpression, Expression lam
11461146

11471147
protected override Expression VisitMember(MemberExpression memberExpression)
11481148
{
1149+
// Fold member access into conditional, i.e. transform
1150+
// (test ? expr1 : expr2).Member -> (test ? expr1.Member : expr2.Member)
1151+
if (memberExpression.Expression is ConditionalExpression cond) {
1152+
return Visit(Expression.Condition(
1153+
cond.Test,
1154+
Expression.MakeMemberAccess(cond.IfTrue, memberExpression.Member),
1155+
Expression.MakeMemberAccess(cond.IfFalse, memberExpression.Member)
1156+
));
1157+
}
1158+
11491159
var innerExpression = Visit(memberExpression.Expression);
11501160

11511161
return TryExpand(innerExpression, MemberIdentity.Create(memberExpression.Member))

src/EFCore.Relational/Query/RelationalSqlTranslatingExpressionVisitor.cs

+10
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,16 @@ protected override Expression VisitListInit(ListInitExpression listInitExpressio
631631
/// <inheritdoc />
632632
protected override Expression VisitMember(MemberExpression memberExpression)
633633
{
634+
// Fold member access into conditional, i.e. transform
635+
// (test ? expr1 : expr2).Member -> (test ? expr1.Member : expr2.Member)
636+
if (memberExpression.Expression is ConditionalExpression cond) {
637+
return Visit(Expression.Condition(
638+
cond.Test,
639+
Expression.MakeMemberAccess(cond.IfTrue, memberExpression.Member),
640+
Expression.MakeMemberAccess(cond.IfFalse, memberExpression.Member)
641+
));
642+
}
643+
634644
var innerExpression = Visit(memberExpression.Expression);
635645

636646
return TryBindMember(innerExpression, MemberIdentity.Create(memberExpression.Member), out var expression)

0 commit comments

Comments
 (0)