From: <ric...@us...> - 2011-03-04 16:51:25
|
Revision: 5416 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5416&view=rev Author: ricbrown Date: 2011-03-04 16:51:18 +0000 (Fri, 04 Mar 2011) Log Message: ----------- Fix NH-2172 (Unrecognised method call in expression when using QueryOver queries in VB.Net) 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-03 22:37:25 UTC (rev 5415) +++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2011-03-04 16:51:18 UTC (rev 5416) @@ -312,6 +312,9 @@ private static ICriterion ProcessSimpleExpression(BinaryExpression be) { + 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); @@ -329,6 +332,22 @@ return criterion; } + 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); + } + } + private static ICriterion ProcessSimpleNullExpression(string property, ExpressionType expressionType) { if (expressionType == ExpressionType.Equal) Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2011-03-03 22:37:25 UTC (rev 5415) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2011-03-04 16:51:18 UTC (rev 5416) @@ -44,7 +44,29 @@ AssertCriteriaAreEqual(expected, actual); } + public static int CompareString(string left, string right, bool textCompare) + { + // could consider calling Microsoft.VisualBasic.CompilerServices.Operators.CompareString + throw new Exception("This is just here to allow us to simulate the VB.Net LINQ expression tree"); + } + [Test] + public void StringEqualityInVisualBasic() + { + ICriteria expected = + CreateTestCriteria(typeof(Person)) + .Add(Restrictions.Eq("Name", "test name")) + .Add(Restrictions.Not(Restrictions.Eq("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); + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] public void PropertyCriterion_NoAlias() { ICriteria expected = This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |