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