From: <ric...@us...> - 2011-05-28 11:13:57
|
Revision: 5877 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5877&view=rev Author: ricbrown Date: 2011-05-28 11:13:51 +0000 (Sat, 28 May 2011) Log Message: ----------- NH-2683: Added QueryOver functions to OrderBy Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverOrderBuilder.cs trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverOrderBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverOrderBuilder.cs 2011-05-28 07:12:07 UTC (rev 5876) +++ trunk/nhibernate/src/NHibernate/Criterion/Lambda/QueryOverOrderBuilder.cs 2011-05-28 11:13:51 UTC (rev 5877) @@ -70,7 +70,10 @@ if (projection != null) root.UnderlyingCriteria.AddOrder(orderDelegate(projection)); else - root.UnderlyingCriteria.AddOrder(ExpressionProcessor.ProcessOrder(path, orderStringDelegate, isAlias)); + if (isAlias) + root.UnderlyingCriteria.AddOrder(ExpressionProcessor.ProcessOrder(path, orderStringDelegate)); + else + root.UnderlyingCriteria.AddOrder(ExpressionProcessor.ProcessOrder(path, orderDelegate)); } public TReturn Asc Modified: trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2011-05-28 07:12:07 UTC (rev 5876) +++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2011-05-28 11:13:51 UTC (rev 5877) @@ -650,17 +650,29 @@ /// </summary> /// <param name="expression">The lambda expression to convert</param> /// <param name="orderDelegate">The appropriate order delegate (order direction)</param> - /// <param name="isAlias">Indicates if the path is an aliased projection</param> /// <returns>NHibernate Order</returns> public static Order ProcessOrder( LambdaExpression expression, - Func<string, Order> orderDelegate, - bool isAlias) + Func<string, Order> orderDelegate) { - string property = isAlias ? FindPropertyExpression(expression.Body) : FindMemberExpression(expression.Body); + string property = FindPropertyExpression(expression.Body); Order order = orderDelegate(property); return order; } + /// <summary> + /// Convert a lambda expression to NHibernate Order + /// </summary> + /// <param name="expression">The lambda expression to convert</param> + /// <param name="orderDelegate">The appropriate order delegate (order direction)</param> + /// <returns>NHibernate Order</returns> + public static Order ProcessOrder( LambdaExpression expression, + Func<IProjection, Order> orderDelegate) + { + IProjection projection = FindMemberProjection(expression.Body); + Order order = orderDelegate(projection); + return order; + } + private static AbstractCriterion ProcessSubqueryExpression(LambdaSubqueryType subqueryType, BinaryExpression be) { Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2011-05-28 07:12:07 UTC (rev 5876) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2011-05-28 11:13:51 UTC (rev 5877) @@ -640,6 +640,34 @@ } [Test] + public void FunctionsOrder() + { + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + s.Save(new Person() { Name = "p2", BirthDate = new DateTime(2008, 07, 06) }); + s.Save(new Person() { Name = "p1", BirthDate = new DateTime(2009, 08, 07) }); + s.Save(new Person() { Name = "p3", BirthDate = new DateTime(2007, 06, 05) }); + + t.Commit(); + } + + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + var persons = + s.QueryOver<Person>() + .OrderBy(p => p.BirthDate.YearPart()).Desc + .List(); + + persons.Count.Should().Be(3); + persons[0].Name.Should().Be("p1"); + persons[1].Name.Should().Be("p2"); + persons[2].Name.Should().Be("p3"); + } + } + + [Test] public void MultiCriteria() { SetupPagingData(); Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2011-05-28 07:12:07 UTC (rev 5876) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2011-05-28 11:13:51 UTC (rev 5877) @@ -608,10 +608,10 @@ { ICriteria expected = CreateTestCriteria(typeof(Person), "personAlias") - .AddOrder(Order.Asc("Name")) - .AddOrder(Order.Desc("Age")) - .AddOrder(Order.Desc("personAlias.Name")) - .AddOrder(Order.Asc("personAlias.Age")) + .AddOrder(Order.Asc(Projections.Property("Name"))) + .AddOrder(Order.Desc(Projections.Property("Age"))) + .AddOrder(Order.Desc(Projections.Property("personAlias.Name"))) + .AddOrder(Order.Asc(Projections.Property("personAlias.Age"))) .AddOrder(Order.Asc("summary")) .AddOrder(Order.Desc("Count")); @@ -630,11 +630,26 @@ } [Test] + public void OrderByFunction() + { + ICriteria expected = + CreateTestCriteria(typeof(Person), "personAlias") + .AddOrder(Order.Desc(Projections.SqlFunction("year", NHibernateUtil.Int32, Projections.Property("personAlias.BirthDate")))); + + Person personAlias = null; + IQueryOver<Person> actual = + CreateTestQueryOver<Person>(() => personAlias) + .OrderBy(() => personAlias.BirthDate.YearPart()).Desc; + + AssertCriteriaAreEqual(expected, actual); + } + + [Test] public void AllowSingleCallSyntax() { ICriteria expected = CreateTestCriteria(typeof(Person)); expected.Add(Restrictions.IsNotEmpty("Children")); - expected.AddOrder(Order.Asc("Name")); + expected.AddOrder(Order.Asc(Projections.Property("Name"))); expected.SetFetchMode("PersonList", FetchMode.Eager); expected.SetLockMode(LockMode.UpgradeNoWait); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |