Skip to content

Commit 00bcaec

Browse files
committed
Fix broken test
1 parent 9f2a1f7 commit 00bcaec

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
@@ -16,6 +16,7 @@
1616
using NHibernate.Type;
1717
using Remotion.Linq.Clauses;
1818
using Remotion.Linq.Clauses.Expressions;
19+
using Remotion.Linq.Parsing;
1920

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

Comments
 (0)