Skip to content

Commit ce13e10

Browse files
committed
Fix NH-2172 (Unrecognised method call in expression when using QueryOver queries in VB.Net) - updated fix to handle property comparisons
SVN: trunk@5422
1 parent 58b8f95 commit ce13e10

File tree

2 files changed

+31
-10
lines changed

2 files changed

+31
-10
lines changed

src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public static int CompareString(string left, string right, bool textCompare)
5151
}
5252

5353
[Test]
54-
public void StringEqualityInVisualBasic()
54+
public void VisualBasicStringComparison()
5555
{
5656
ICriteria expected =
5757
CreateTestCriteria(typeof(Person))
@@ -60,7 +60,13 @@ public void StringEqualityInVisualBasic()
6060
.Add(Restrictions.Gt("Name", "test name"))
6161
.Add(Restrictions.Ge("Name", "test name"))
6262
.Add(Restrictions.Lt("Name", "test name"))
63-
.Add(Restrictions.Le("Name", "test name"));
63+
.Add(Restrictions.Le("Name", "test name"))
64+
.Add(Restrictions.EqProperty("Name", "Name"))
65+
.Add(Restrictions.Not(Restrictions.EqProperty("Name", "Name")))
66+
.Add(Restrictions.GtProperty("Name", "Name"))
67+
.Add(Restrictions.GeProperty("Name", "Name"))
68+
.Add(Restrictions.LtProperty("Name", "Name"))
69+
.Add(Restrictions.LeProperty("Name", "Name"));
6470

6571
IQueryOver<Person> actual =
6672
CreateTestQueryOver<Person>()
@@ -69,7 +75,13 @@ public void StringEqualityInVisualBasic()
6975
.And(p => CompareString(p.Name, "test name", true) > 0)
7076
.And(p => CompareString(p.Name, "test name", true) >= 0)
7177
.And(p => CompareString(p.Name, "test name", true) < 0)
72-
.And(p => CompareString(p.Name, "test name", true) <= 0);
78+
.And(p => CompareString(p.Name, "test name", true) <= 0)
79+
.And(p => CompareString(p.Name, p.Name, true) == 0)
80+
.And(p => CompareString(p.Name, p.Name, true) != 0)
81+
.And(p => CompareString(p.Name, p.Name, true) > 0)
82+
.And(p => CompareString(p.Name, p.Name, true) >= 0)
83+
.And(p => CompareString(p.Name, p.Name, true) < 0)
84+
.And(p => CompareString(p.Name, p.Name, true) <= 0);
7385

7486
AssertCriteriaAreEqual(expected, actual);
7587
}

src/NHibernate/Impl/ExpressionProcessor.cs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ private static ICriterion ProcessSimpleExpression(BinaryExpression be)
318318
return ProcessSimpleExpression(be.Left, be.Right, be.NodeType);
319319
}
320320

321-
public static ICriterion ProcessSimpleExpression(Expression left, Expression right, ExpressionType nodeType)
321+
private static ICriterion ProcessSimpleExpression(Expression left, Expression right, ExpressionType nodeType)
322322
{
323323
string property = FindMemberExpression(left);
324324
System.Type propertyType = FindMemberType(left);
@@ -340,7 +340,11 @@ public static ICriterion ProcessSimpleExpression(Expression left, Expression rig
340340
private static ICriterion ProcessVisualBasicStringComparison(BinaryExpression be)
341341
{
342342
var methodCall = (MethodCallExpression)be.Left;
343-
return ProcessSimpleExpression(methodCall.Arguments[0], methodCall.Arguments[1], be.NodeType);
343+
344+
if (IsMemberExpression(methodCall.Arguments[1]))
345+
return ProcessMemberExpression(methodCall.Arguments[0], methodCall.Arguments[1], be.NodeType);
346+
else
347+
return ProcessSimpleExpression(methodCall.Arguments[0], methodCall.Arguments[1], be.NodeType);
344348
}
345349

346350
private static ICriterion ProcessSimpleNullExpression(string property, ExpressionType expressionType)
@@ -357,13 +361,18 @@ private static ICriterion ProcessSimpleNullExpression(string property, Expressio
357361

358362
private static ICriterion ProcessMemberExpression(BinaryExpression be)
359363
{
360-
string leftProperty = FindMemberExpression(be.Left);
361-
string rightProperty = FindMemberExpression(be.Right);
364+
return ProcessMemberExpression(be.Left, be.Right, be.NodeType);
365+
}
366+
367+
private static ICriterion ProcessMemberExpression(Expression left, Expression right, ExpressionType nodeType)
368+
{
369+
string leftProperty = FindMemberExpression(left);
370+
string rightProperty = FindMemberExpression(right);
362371

363-
if (!_propertyExpressionCreators.ContainsKey(be.NodeType))
364-
throw new Exception("Unhandled property expression type: " + be.NodeType);
372+
if (!_propertyExpressionCreators.ContainsKey(nodeType))
373+
throw new Exception("Unhandled property expression type: " + nodeType);
365374

366-
Func<string, string, ICriterion> propertyExpressionCreator = _propertyExpressionCreators[be.NodeType];
375+
Func<string, string, ICriterion> propertyExpressionCreator = _propertyExpressionCreators[nodeType];
367376
ICriterion criterion = propertyExpressionCreator(leftProperty, rightProperty);
368377
return criterion;
369378
}

0 commit comments

Comments
 (0)