Skip to content

Commit cdc8f71

Browse files
committed
Fix broken test
1 parent ac5e116 commit cdc8f71

File tree

7 files changed

+36
-8
lines changed

7 files changed

+36
-8
lines changed

src/NHibernate.Test/Linq/ParameterTypeLocatorTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ private void AssertResult(
415415
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
416416
var expressionText = pair.Key.ToString();
417417
Assert.That(expectedResults.ContainsKey(expressionText), Is.True, $"{expressionText} constant is not expected");
418-
Assert.That(expectedResults[expressionText](pair.Value.Type), Is.True, $"Invalid type, actual type: {pair.Value?.Name ?? "null"}");
418+
Assert.That(expectedResults[expressionText](pair.Value.Type), Is.True, $"Invalid type, actual type: {pair.Value?.Type?.Name ?? "null"}");
419419
}
420420
finally
421421
{

src/NHibernate/Linq/NhLinqExpression.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using NHibernate.Linq.Visitors;
99
using NHibernate.Param;
1010
using NHibernate.Type;
11-
using Remotion.Linq;
1211

1312
namespace NHibernate.Linq
1413
{

src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -207,18 +207,19 @@ protected override Expression VisitMember(MemberExpression expression)
207207
return expression;
208208
}
209209

210+
#if NETCOREAPP2_0
210211
protected override Expression VisitInvocation(InvocationExpression expression)
211212
{
212213
if (ExpressionsHelper.TryGetDynamicMemberBinder(expression, out var memberBinder))
213214
{
214215
Visit(expression.Arguments[1]);
215-
_string.Append(".");
216-
_string.Append(memberBinder.Name);
216+
FormatBinder(memberBinder);
217217
return expression;
218218
}
219219

220220
return base.VisitInvocation(expression);
221221
}
222+
#endif
222223

223224
protected override Expression VisitMethodCall(MethodCallExpression expression)
224225
{
@@ -279,8 +280,8 @@ protected override Expression VisitQuerySourceReference(Remotion.Linq.Clauses.Ex
279280

280281
protected override Expression VisitDynamic(DynamicExpression expression)
281282
{
282-
FormatBinder(expression.Binder);
283283
Visit(expression.Arguments, AppendCommas);
284+
FormatBinder(expression.Binder);
284285
return expression;
285286
}
286287

src/NHibernate/Linq/Visitors/ExpressionParameterVisitor.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ protected override Expression VisitMethodCall(MethodCallExpression expression)
106106
return base.VisitMethodCall(expression);
107107
}
108108

109+
#if NETCOREAPP2_0
109110
protected override Expression VisitInvocation(InvocationExpression expression)
110111
{
111112
if (ExpressionsHelper.TryGetDynamicMemberBinder(expression, out _))
@@ -117,6 +118,7 @@ protected override Expression VisitInvocation(InvocationExpression expression)
117118

118119
return base.VisitInvocation(expression);
119120
}
121+
#endif
120122

121123
protected override Expression VisitConstant(ConstantExpression expression)
122124
{

src/NHibernate/Linq/Visitors/HqlGeneratorExpressionVisitor.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,13 +226,14 @@ private HqlTreeNode VisitNhNominated(NhNominatedExpression nhNominatedExpression
226226

227227
private HqlTreeNode VisitInvocationExpression(InvocationExpression expression)
228228
{
229+
#if NETCOREAPP2_0
229230
if (ExpressionsHelper.TryGetDynamicMemberBinder(expression, out var binder))
230231
{
231232
return _hqlTreeBuilder.Dot(
232233
VisitExpression(expression.Arguments[1]).AsExpression(),
233234
_hqlTreeBuilder.Ident(binder.Name));
234235
}
235-
236+
#endif
236237
return VisitExpression(expression.Expression);
237238
}
238239

src/NHibernate/Linq/Visitors/ParameterTypeLocator.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Dynamic;
23
using System.Linq.Expressions;
34
using NHibernate.Engine;
45
using NHibernate.Param;
@@ -289,9 +290,13 @@ private bool IsDynamicMember(Expression expression)
289290
{
290291
switch (expression)
291292
{
293+
#if NETCOREAPP2_0
292294
case InvocationExpression invocationExpression:
293295
// session.Query<Product>().Where("Properties.Name == @0", "First Product")
294296
return ExpressionsHelper.TryGetDynamicMemberBinder(invocationExpression, out _);
297+
#endif
298+
case DynamicExpression dynamicExpression:
299+
return dynamicExpression.Binder is GetMemberBinder;
295300
case MethodCallExpression methodCallExpression:
296301
// session.Query<Product>() where p.Properties["Name"] == "First Product" select p
297302
return VisitorUtil.TryGetPotentialDynamicComponentDictionaryMember(methodCallExpression, out _);

src/NHibernate/Util/ExpressionsHelper.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using NHibernate.Type;
1616
using Remotion.Linq.Clauses;
1717
using Remotion.Linq.Clauses.Expressions;
18+
using Remotion.Linq.Parsing;
1819

1920
namespace 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

Comments
 (0)