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