16
16
using NHibernate . Type ;
17
17
using Remotion . Linq . Clauses ;
18
18
using Remotion . Linq . Clauses . Expressions ;
19
+ using Remotion . Linq . Parsing ;
19
20
20
21
namespace NHibernate . Util
21
22
{
@@ -31,6 +32,7 @@ public static MemberInfo DecodeMemberAccessExpression<TEntity, TResult>(Expressi
31
32
return ( ( MemberExpression ) expression . Body ) . Member ;
32
33
}
33
34
35
+ #if NETCOREAPP2_0
34
36
/// <summary>
35
37
/// Try to retrieve <see cref="GetMemberBinder"/> from a reduced <see cref="ExpressionType.Dynamic"/> expression.
36
38
/// </summary>
@@ -39,7 +41,9 @@ public static MemberInfo DecodeMemberAccessExpression<TEntity, TResult>(Expressi
39
41
/// <returns>Whether the binder was found.</returns>
40
42
internal static bool TryGetDynamicMemberBinder ( InvocationExpression expression , out GetMemberBinder memberBinder )
41
43
{
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.
43
47
// Unfortunately we can not tap into the expression tree earlier to intercept the dynamic expression
44
48
if ( expression . Arguments . Count == 2 &&
45
49
expression . Arguments [ 0 ] is ConstantExpression constant &&
@@ -53,6 +57,7 @@ constant.Value is CallSite site &&
53
57
memberBinder = null ;
54
58
return false ;
55
59
}
60
+ #endif
56
61
57
62
/// <summary>
58
63
/// Check whether the given expression represent a variable.
@@ -659,6 +664,7 @@ protected override Expression VisitMember(MemberExpression node)
659
664
return base . Visit ( node . Expression ) ;
660
665
}
661
666
667
+ #if NETCOREAPP2_0
662
668
protected override Expression VisitInvocation ( InvocationExpression node )
663
669
{
664
670
if ( TryGetDynamicMemberBinder ( node , out var binder ) )
@@ -669,7 +675,21 @@ protected override Expression VisitInvocation(InvocationExpression node)
669
675
return base . Visit ( node . Arguments [ 1 ] ) ;
670
676
}
671
677
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 ) ;
673
693
}
674
694
675
695
protected override Expression VisitQuerySourceReference ( QuerySourceReferenceExpression node )
0 commit comments