1515using NHibernate . Type ;
1616using Remotion . Linq . Clauses ;
1717using Remotion . Linq . Clauses . Expressions ;
18+ using Remotion . Linq . Parsing ;
1819
1920namespace NHibernate . Util
2021{
@@ -30,6 +31,7 @@ public static MemberInfo DecodeMemberAccessExpression<TEntity, TResult>(Expressi
3031 return ( ( MemberExpression ) expression . Body ) . Member ;
3132 }
3233
34+ #if NETCOREAPP2_0
3335 /// <summary>
3436 /// Try to retrieve <see cref="GetMemberBinder"/> from a reduced <see cref="ExpressionType.Dynamic"/> expression.
3537 /// </summary>
@@ -38,7 +40,9 @@ public static MemberInfo DecodeMemberAccessExpression<TEntity, TResult>(Expressi
3840 /// <returns>Whether the binder was found.</returns>
3941 internal static bool TryGetDynamicMemberBinder ( InvocationExpression expression , out GetMemberBinder memberBinder )
4042 {
41- // This is an ugly workaround for dynamic expressions.
43+ // This is an ugly workaround for dynamic expressions in .NET Core. In .NET Core a dynamic expression is reduced
44+ // when first visited by a expression visitor that is not a DynamicExpressionVisitor, where in .NET Framework it is never reduced.
45+ // As RelinqExpressionVisitor does not extend DynamicExpressionVisitor, we will always have a reduced dynamic expression in .NET Core.
4246 // Unfortunately we can not tap into the expression tree earlier to intercept the dynamic expression
4347 if ( expression . Arguments . Count == 2 &&
4448 expression . Arguments [ 0 ] is ConstantExpression constant &&
@@ -52,6 +56,7 @@ constant.Value is CallSite site &&
5256 memberBinder = null ;
5357 return false ;
5458 }
59+ #endif
5560
5661 /// <summary>
5762 /// Check whether the given expression represent a variable.
@@ -658,6 +663,7 @@ protected override Expression VisitMember(MemberExpression node)
658663 return base . Visit ( node . Expression ) ;
659664 }
660665
666+ #if NETCOREAPP2_0
661667 protected override Expression VisitInvocation ( InvocationExpression node )
662668 {
663669 if ( TryGetDynamicMemberBinder ( node , out var binder ) )
@@ -668,7 +674,21 @@ protected override Expression VisitInvocation(InvocationExpression node)
668674 return base . Visit ( node . Arguments [ 1 ] ) ;
669675 }
670676
671- return base . Visit ( node ) ;
677+ return base . VisitInvocation ( node ) ;
678+ }
679+ #endif
680+
681+ protected override Expression VisitDynamic ( DynamicExpression node )
682+ {
683+ if ( node . Binder is GetMemberBinder binder )
684+ {
685+ _memberPaths . Push ( new MemberMetadata ( binder . Name , _convertType , _hasIndexer ) ) ;
686+ _convertType = null ;
687+ _hasIndexer = false ;
688+ return base . Visit ( node . Arguments [ 0 ] ) ;
689+ }
690+
691+ return Visit ( node ) ;
672692 }
673693
674694 protected override Expression VisitQuerySourceReference ( QuerySourceReferenceExpression node )
0 commit comments