|
From: <Ric...@us...> - 2009-06-29 20:57:51
|
Revision: 4548
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4548&view=rev
Author: RicBrown
Date: 2009-06-29 20:56:51 +0000 (Mon, 29 Jun 2009)
Log Message:
-----------
Added handling of multiple ICriterion in a single expression.
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs
trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/CriteriaOfTFixture.cs
trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Model.cs
Modified: trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2009-06-29 20:20:14 UTC (rev 4547)
+++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2009-06-29 20:56:51 UTC (rev 4548)
@@ -278,12 +278,46 @@
return criterion;
}
+ private static ICriterion ProcessAndExpression(BinaryExpression expression)
+ {
+ return
+ NHibernate.Criterion.Restrictions.And(
+ ProcessExpression(expression.Left),
+ ProcessExpression(expression.Right));
+ }
+
+ private static ICriterion ProcessOrExpression(BinaryExpression expression)
+ {
+ return
+ NHibernate.Criterion.Restrictions.Or(
+ ProcessExpression(expression.Left),
+ ProcessExpression(expression.Right));
+ }
+
private static ICriterion ProcessBinaryExpression(BinaryExpression expression)
{
- if (IsMemberExpression(expression.Right))
- return ProcessMemberExpression(expression);
- else
- return ProcessSimpleExpression(expression);
+ switch (expression.NodeType)
+ {
+ case ExpressionType.AndAlso:
+ return ProcessAndExpression(expression);
+
+ case ExpressionType.OrElse:
+ return ProcessOrExpression(expression);
+
+ case ExpressionType.Equal:
+ case ExpressionType.NotEqual:
+ case ExpressionType.GreaterThan:
+ case ExpressionType.GreaterThanOrEqual:
+ case ExpressionType.LessThan:
+ case ExpressionType.LessThanOrEqual:
+ if (IsMemberExpression(expression.Right))
+ return ProcessMemberExpression(expression);
+ else
+ return ProcessSimpleExpression(expression);
+
+ default:
+ throw new Exception("Unhandled binary expression: " + expression.NodeType + ", " + expression.ToString());
+ }
}
private static ICriterion ProcessBooleanExpression(Expression expression)
@@ -306,16 +340,19 @@
throw new Exception("Could not determine member type from " + expression.ToString());
}
- private static ICriterion ProcessLambdaExpression(LambdaExpression expression)
+ private static ICriterion ProcessExpression(Expression expression)
{
- var body = expression.Body;
-
- if (body is BinaryExpression)
- return ProcessBinaryExpression((BinaryExpression)body);
+ if (expression is BinaryExpression)
+ return ProcessBinaryExpression((BinaryExpression)expression);
else
- return ProcessBooleanExpression((Expression)body);
+ return ProcessBooleanExpression((Expression)expression);
}
+ private static ICriterion ProcessLambdaExpression(LambdaExpression expression)
+ {
+ return ProcessExpression(expression.Body);
+ }
+
/// <summary>
/// Convert a lambda expression to NHibernate ICriterion
/// </summary>
Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/CriteriaOfTFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/CriteriaOfTFixture.cs 2009-06-29 20:20:14 UTC (rev 4547)
+++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/CriteriaOfTFixture.cs 2009-06-29 20:56:51 UTC (rev 4548)
@@ -64,6 +64,24 @@
}
[Test]
+ public void MultipleCriterionExpression()
+ {
+ ICriteria expected =
+ CreateTestCriteria(typeof(Person))
+ .Add(Restrictions.And(
+ Restrictions.Eq("Name", "test name"),
+ Restrictions.Or(
+ Restrictions.Gt("Age", 21),
+ Restrictions.Eq("HasCar", true))));
+
+ ICriteria<Person> actual =
+ CreateTestQueryOver<Person>()
+ .Where(p => p.Name == "test name" && (p.Age > 21 || p.HasCar));
+
+ AssertCriteriaAreEqual(expected, actual);
+ }
+
+ [Test]
public void Where_BehavesTheSameAs_And()
{
Person personAlias = null;
Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Model.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Model.cs 2009-06-29 20:20:14 UTC (rev 4547)
+++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/Model.cs 2009-06-29 20:56:51 UTC (rev 4548)
@@ -11,6 +11,7 @@
public virtual string Name { get; set; }
public virtual int Age { get; set; }
public virtual int Height { get; set; }
+ public virtual bool HasCar { get; set; }
public virtual Person Father { get; set; }
public virtual IEnumerable<Child> Children { get; set; }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|