From: <ric...@us...> - 2011-03-05 10:51:27
|
Revision: 5422 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5422&view=rev Author: ricbrown Date: 2011-03-05 10:51:21 +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 property 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-05 08:01:01 UTC (rev 5421) +++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2011-03-05 10:51:21 UTC (rev 5422) @@ -318,7 +318,7 @@ return ProcessSimpleExpression(be.Left, be.Right, be.NodeType); } - public static ICriterion ProcessSimpleExpression(Expression left, Expression right, ExpressionType nodeType) + private static ICriterion ProcessSimpleExpression(Expression left, Expression right, ExpressionType nodeType) { string property = FindMemberExpression(left); System.Type propertyType = FindMemberType(left); @@ -340,7 +340,11 @@ private static ICriterion ProcessVisualBasicStringComparison(BinaryExpression be) { var methodCall = (MethodCallExpression)be.Left; - return ProcessSimpleExpression(methodCall.Arguments[0], methodCall.Arguments[1], be.NodeType); + + if (IsMemberExpression(methodCall.Arguments[1])) + return ProcessMemberExpression(methodCall.Arguments[0], methodCall.Arguments[1], be.NodeType); + else + return ProcessSimpleExpression(methodCall.Arguments[0], methodCall.Arguments[1], be.NodeType); } private static ICriterion ProcessSimpleNullExpression(string property, ExpressionType expressionType) @@ -357,13 +361,18 @@ private static ICriterion ProcessMemberExpression(BinaryExpression be) { - string leftProperty = FindMemberExpression(be.Left); - string rightProperty = FindMemberExpression(be.Right); + return ProcessMemberExpression(be.Left, be.Right, be.NodeType); + } - if (!_propertyExpressionCreators.ContainsKey(be.NodeType)) - throw new Exception("Unhandled property expression type: " + be.NodeType); + private static ICriterion ProcessMemberExpression(Expression left, Expression right, ExpressionType nodeType) + { + string leftProperty = FindMemberExpression(left); + string rightProperty = FindMemberExpression(right); - Func<string, string, ICriterion> propertyExpressionCreator = _propertyExpressionCreators[be.NodeType]; + if (!_propertyExpressionCreators.ContainsKey(nodeType)) + throw new Exception("Unhandled property expression type: " + nodeType); + + Func<string, string, ICriterion> propertyExpressionCreator = _propertyExpressionCreators[nodeType]; ICriterion criterion = propertyExpressionCreator(leftProperty, rightProperty); return criterion; } Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2011-03-05 08:01:01 UTC (rev 5421) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2011-03-05 10:51:21 UTC (rev 5422) @@ -51,7 +51,7 @@ } [Test] - public void StringEqualityInVisualBasic() + public void VisualBasicStringComparison() { ICriteria expected = CreateTestCriteria(typeof(Person)) @@ -60,7 +60,13 @@ .Add(Restrictions.Gt("Name", "test name")) .Add(Restrictions.Ge("Name", "test name")) .Add(Restrictions.Lt("Name", "test name")) - .Add(Restrictions.Le("Name", "test name")); + .Add(Restrictions.Le("Name", "test name")) + .Add(Restrictions.EqProperty("Name", "Name")) + .Add(Restrictions.Not(Restrictions.EqProperty("Name", "Name"))) + .Add(Restrictions.GtProperty("Name", "Name")) + .Add(Restrictions.GeProperty("Name", "Name")) + .Add(Restrictions.LtProperty("Name", "Name")) + .Add(Restrictions.LeProperty("Name", "Name")); IQueryOver<Person> actual = CreateTestQueryOver<Person>() @@ -69,7 +75,13 @@ .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, p.Name, true) == 0) + .And(p => CompareString(p.Name, p.Name, true) != 0) + .And(p => CompareString(p.Name, p.Name, true) > 0) + .And(p => CompareString(p.Name, p.Name, true) >= 0) + .And(p => CompareString(p.Name, p.Name, true) < 0) + .And(p => CompareString(p.Name, p.Name, true) <= 0); AssertCriteriaAreEqual(expected, actual); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |