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. |