diff --git a/src/NHibernate.Test/Linq/OperatorTests.cs b/src/NHibernate.Test/Linq/OperatorTests.cs index e7cb8ab01b7..e9cb7458258 100644 --- a/src/NHibernate.Test/Linq/OperatorTests.cs +++ b/src/NHibernate.Test/Linq/OperatorTests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Text; using NHibernate.DomainModel.Northwind.Entities; using NHibernate.Linq; @@ -16,5 +17,21 @@ public void Mod() { Assert.AreEqual(2, session.Query().Where(a => a.NumberOfHours % 7 == 0).Count()); } - } + + [Test] + public void UnaryMinus() + { + Assert.AreEqual(1, session.Query().Count(a => -a.NumberOfHours == -7)); + } + + [Test] + public void UnaryPlus() + { + // Ensure expression tree contains UnaryPlus + var param = Expression.Parameter(typeof(TimesheetEntry), "e"); + var expr = Expression.Equal(Expression.UnaryPlus(Expression.PropertyOrField(param, "NumberOfHours")), Expression.Constant(7)); + var predicate = Expression.Lambda>(expr, param); + Assert.AreEqual(1, session.Query().Count(predicate)); + } + } } diff --git a/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs b/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs index 5dc05afcad0..d384c6f75ed 100755 --- a/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs +++ b/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs @@ -124,6 +124,11 @@ public HqlDivide Divide(HqlExpression lhs, HqlExpression rhs) return new HqlDivide(_factory, lhs, rhs); } + public HqlNegate Negate(HqlExpression expression) + { + return new HqlNegate(_factory, expression); + } + public HqlDot Dot(HqlExpression lhs, HqlExpression rhs) { return new HqlDot(_factory, lhs, rhs); diff --git a/src/NHibernate/Hql/Ast/HqlTreeNode.cs b/src/NHibernate/Hql/Ast/HqlTreeNode.cs index 2a28621e099..a6db5c46330 100755 --- a/src/NHibernate/Hql/Ast/HqlTreeNode.cs +++ b/src/NHibernate/Hql/Ast/HqlTreeNode.cs @@ -322,6 +322,14 @@ public HqlAdd(IASTFactory factory, HqlExpression lhs, HqlExpression rhs) } } + public class HqlNegate : HqlExpression + { + public HqlNegate(IASTFactory factory, HqlExpression expression) + : base(HqlSqlWalker.UNARY_MINUS, "-", factory, expression) + { + } + } + public class HqlBooleanOr : HqlBooleanExpression { public HqlBooleanOr(IASTFactory factory, HqlBooleanExpression lhs, HqlBooleanExpression rhs) diff --git a/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs b/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs index b36418c1d51..dbe44395a50 100644 --- a/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs +++ b/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs @@ -438,6 +438,10 @@ protected HqlTreeNode VisitUnaryExpression(UnaryExpression expression) { switch (expression.NodeType) { + case ExpressionType.Negate: + return _hqlTreeBuilder.Negate(VisitExpression(expression.Operand).AsExpression()); + case ExpressionType.UnaryPlus: + return VisitExpression(expression.Operand).AsExpression(); case ExpressionType.Not: return _hqlTreeBuilder.BooleanNot(VisitExpression(expression.Operand).ToBooleanExpression()); case ExpressionType.Convert: