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