1616using NHibernate . Type ;
1717using Remotion . Linq . Clauses ;
1818using Remotion . Linq . Clauses . Expressions ;
19+ using Remotion . Linq . Parsing ;
1920
2021namespace NHibernate . Util
2122{
@@ -31,6 +32,7 @@ public static MemberInfo DecodeMemberAccessExpression<TEntity, TResult>(Expressi
3132 return ( ( MemberExpression ) expression . Body ) . Member ;
3233 }
3334
35+ #if NETCOREAPP2_0
3436 /// <summary>
3537 /// Try to retrieve <see cref="GetMemberBinder"/> from a reduced <see cref="ExpressionType.Dynamic"/> expression.
3638 /// </summary>
@@ -39,7 +41,9 @@ public static MemberInfo DecodeMemberAccessExpression<TEntity, TResult>(Expressi
3941 /// <returns>Whether the binder was found.</returns>
4042 internal static bool TryGetDynamicMemberBinder ( InvocationExpression expression , out GetMemberBinder memberBinder )
4143 {
42- // This is an ugly workaround for dynamic expressions.
44+ // This is an ugly workaround for dynamic expressions in .NET Core. In .NET Core a dynamic expression is reduced
45+ // when first visited by a expression visitor that is not a DynamicExpressionVisitor, where in .NET Framework it is never reduced.
46+ // As RelinqExpressionVisitor does not extend DynamicExpressionVisitor, we will always have a reduced dynamic expression in .NET Core.
4347 // Unfortunately we can not tap into the expression tree earlier to intercept the dynamic expression
4448 if ( expression . Arguments . Count == 2 &&
4549 expression . Arguments [ 0 ] is ConstantExpression constant &&
@@ -53,6 +57,7 @@ constant.Value is CallSite site &&
5357 memberBinder = null ;
5458 return false ;
5559 }
60+ #endif
5661
5762 /// <summary>
5863 /// Check whether the given expression represent a variable.
@@ -659,6 +664,7 @@ protected override Expression VisitMember(MemberExpression node)
659664 return base . Visit ( node . Expression ) ;
660665 }
661666
667+ #if NETCOREAPP2_0
662668 protected override Expression VisitInvocation ( InvocationExpression node )
663669 {
664670 if ( TryGetDynamicMemberBinder ( node , out var binder ) )
@@ -669,7 +675,21 @@ protected override Expression VisitInvocation(InvocationExpression node)
669675 return base . Visit ( node . Arguments [ 1 ] ) ;
670676 }
671677
672- return base . Visit ( node ) ;
678+ return base . VisitInvocation ( node ) ;
679+ }
680+ #endif
681+
682+ protected override Expression VisitDynamic ( DynamicExpression node )
683+ {
684+ if ( node . Binder is GetMemberBinder binder )
685+ {
686+ _memberPaths . Push ( new MemberMetadata ( binder . Name , _convertType , _hasIndexer ) ) ;
687+ _convertType = null ;
688+ _hasIndexer = false ;
689+ return base . Visit ( node . Arguments [ 0 ] ) ;
690+ }
691+
692+ return Visit ( node ) ;
673693 }
674694
675695 protected override Expression VisitQuerySourceReference ( QuerySourceReferenceExpression node )
0 commit comments