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