|
From: <ric...@us...> - 2011-03-05 08:01:08
|
Revision: 5421
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5421&view=rev
Author: ricbrown
Date: 2011-03-05 08:01:01 +0000 (Sat, 05 Mar 2011)
Log Message:
-----------
Fix NH-2172 (Unrecognised method call in expression when using QueryOver queries in VB.Net) - updated fix to handle other comparisons (<, <=, >, >=)
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs
trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs
Modified: trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2011-03-04 22:51:08 UTC (rev 5420)
+++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2011-03-05 08:01:01 UTC (rev 5421)
@@ -315,19 +315,24 @@
if (be.Left.NodeType == ExpressionType.Call && ((MethodCallExpression)be.Left).Method.Name == "CompareString")
return ProcessVisualBasicStringComparison(be);
- string property = FindMemberExpression(be.Left);
- System.Type propertyType = FindMemberType(be.Left);
+ return ProcessSimpleExpression(be.Left, be.Right, be.NodeType);
+ }
- object value = FindValue(be.Right);
+ public static ICriterion ProcessSimpleExpression(Expression left, Expression right, ExpressionType nodeType)
+ {
+ string property = FindMemberExpression(left);
+ System.Type propertyType = FindMemberType(left);
+
+ object value = FindValue(right);
value = ConvertType(value, propertyType);
if (value == null)
- return ProcessSimpleNullExpression(property, be.NodeType);
+ return ProcessSimpleNullExpression(property, nodeType);
- if (!_simpleExpressionCreators.ContainsKey(be.NodeType))
- throw new Exception("Unhandled simple expression type: " + be.NodeType);
+ if (!_simpleExpressionCreators.ContainsKey(nodeType))
+ throw new Exception("Unhandled simple expression type: " + nodeType);
- Func<string, object, ICriterion> simpleExpressionCreator = _simpleExpressionCreators[be.NodeType];
+ Func<string, object, ICriterion> simpleExpressionCreator = _simpleExpressionCreators[nodeType];
ICriterion criterion = simpleExpressionCreator(property, value);
return criterion;
}
@@ -335,17 +340,7 @@
private static ICriterion ProcessVisualBasicStringComparison(BinaryExpression be)
{
var methodCall = (MethodCallExpression)be.Left;
- switch(be.NodeType)
- {
- case ExpressionType.Equal:
- return ProcessSimpleExpression(Expression.Equal(methodCall.Arguments[0], methodCall.Arguments[1]));
-
- case ExpressionType.NotEqual:
- return ProcessSimpleExpression(Expression.NotEqual(methodCall.Arguments[0], methodCall.Arguments[1]));
-
- default:
- throw new Exception("Unhandled expression: " + be);
- }
+ return ProcessSimpleExpression(methodCall.Arguments[0], methodCall.Arguments[1], be.NodeType);
}
private static ICriterion ProcessSimpleNullExpression(string property, ExpressionType expressionType)
Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2011-03-04 22:51:08 UTC (rev 5420)
+++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2011-03-05 08:01:01 UTC (rev 5421)
@@ -56,12 +56,20 @@
ICriteria expected =
CreateTestCriteria(typeof(Person))
.Add(Restrictions.Eq("Name", "test name"))
- .Add(Restrictions.Not(Restrictions.Eq("Name", "test name")));
+ .Add(Restrictions.Not(Restrictions.Eq("Name", "test name")))
+ .Add(Restrictions.Gt("Name", "test name"))
+ .Add(Restrictions.Ge("Name", "test name"))
+ .Add(Restrictions.Lt("Name", "test name"))
+ .Add(Restrictions.Le("Name", "test name"));
IQueryOver<Person> actual =
CreateTestQueryOver<Person>()
.And(p => CompareString(p.Name, "test name", true) == 0)
- .And(p => CompareString(p.Name, "test name", true) != 0);
+ .And(p => CompareString(p.Name, "test name", true) != 0)
+ .And(p => CompareString(p.Name, "test name", true) > 0)
+ .And(p => CompareString(p.Name, "test name", true) >= 0)
+ .And(p => CompareString(p.Name, "test name", true) < 0)
+ .And(p => CompareString(p.Name, "test name", true) <= 0);
AssertCriteriaAreEqual(expected, actual);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|