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