Skip to content

Commit 58b8f95

Browse files
committed
Fix NH-2172 (Unrecognised method call in expression when using QueryOver queries in VB.Net) - updated fix to handle other comparisons (<, <=, >, >=)
SVN: trunk@5421
1 parent 391a7d6 commit 58b8f95

File tree

2 files changed

+23
-20
lines changed

2 files changed

+23
-20
lines changed

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,20 @@ public void StringEqualityInVisualBasic()
5656
ICriteria expected =
5757
CreateTestCriteria(typeof(Person))
5858
.Add(Restrictions.Eq("Name", "test name"))
59-
.Add(Restrictions.Not(Restrictions.Eq("Name", "test name")));
59+
.Add(Restrictions.Not(Restrictions.Eq("Name", "test name")))
60+
.Add(Restrictions.Gt("Name", "test name"))
61+
.Add(Restrictions.Ge("Name", "test name"))
62+
.Add(Restrictions.Lt("Name", "test name"))
63+
.Add(Restrictions.Le("Name", "test name"));
6064

6165
IQueryOver<Person> actual =
6266
CreateTestQueryOver<Person>()
6367
.And(p => CompareString(p.Name, "test name", true) == 0)
64-
.And(p => CompareString(p.Name, "test name", true) != 0);
68+
.And(p => CompareString(p.Name, "test name", true) != 0)
69+
.And(p => CompareString(p.Name, "test name", true) > 0)
70+
.And(p => CompareString(p.Name, "test name", true) >= 0)
71+
.And(p => CompareString(p.Name, "test name", true) < 0)
72+
.And(p => CompareString(p.Name, "test name", true) <= 0);
6573

6674
AssertCriteriaAreEqual(expected, actual);
6775
}

src/NHibernate/Impl/ExpressionProcessor.cs

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -315,37 +315,32 @@ private static ICriterion ProcessSimpleExpression(BinaryExpression be)
315315
if (be.Left.NodeType == ExpressionType.Call && ((MethodCallExpression)be.Left).Method.Name == "CompareString")
316316
return ProcessVisualBasicStringComparison(be);
317317

318-
string property = FindMemberExpression(be.Left);
319-
System.Type propertyType = FindMemberType(be.Left);
318+
return ProcessSimpleExpression(be.Left, be.Right, be.NodeType);
319+
}
320+
321+
public static ICriterion ProcessSimpleExpression(Expression left, Expression right, ExpressionType nodeType)
322+
{
323+
string property = FindMemberExpression(left);
324+
System.Type propertyType = FindMemberType(left);
320325

321-
object value = FindValue(be.Right);
326+
object value = FindValue(right);
322327
value = ConvertType(value, propertyType);
323328

324329
if (value == null)
325-
return ProcessSimpleNullExpression(property, be.NodeType);
330+
return ProcessSimpleNullExpression(property, nodeType);
326331

327-
if (!_simpleExpressionCreators.ContainsKey(be.NodeType))
328-
throw new Exception("Unhandled simple expression type: " + be.NodeType);
332+
if (!_simpleExpressionCreators.ContainsKey(nodeType))
333+
throw new Exception("Unhandled simple expression type: " + nodeType);
329334

330-
Func<string, object, ICriterion> simpleExpressionCreator = _simpleExpressionCreators[be.NodeType];
335+
Func<string, object, ICriterion> simpleExpressionCreator = _simpleExpressionCreators[nodeType];
331336
ICriterion criterion = simpleExpressionCreator(property, value);
332337
return criterion;
333338
}
334339

335340
private static ICriterion ProcessVisualBasicStringComparison(BinaryExpression be)
336341
{
337342
var methodCall = (MethodCallExpression)be.Left;
338-
switch(be.NodeType)
339-
{
340-
case ExpressionType.Equal:
341-
return ProcessSimpleExpression(Expression.Equal(methodCall.Arguments[0], methodCall.Arguments[1]));
342-
343-
case ExpressionType.NotEqual:
344-
return ProcessSimpleExpression(Expression.NotEqual(methodCall.Arguments[0], methodCall.Arguments[1]));
345-
346-
default:
347-
throw new Exception("Unhandled expression: " + be);
348-
}
343+
return ProcessSimpleExpression(methodCall.Arguments[0], methodCall.Arguments[1], be.NodeType);
349344
}
350345

351346
private static ICriterion ProcessSimpleNullExpression(string property, ExpressionType expressionType)

0 commit comments

Comments
 (0)