|
From: <ric...@us...> - 2009-07-30 09:56:28
|
Revision: 4669
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4669&view=rev
Author: ricbrown
Date: 2009-07-30 09:56:14 +0000 (Thu, 30 Jul 2009)
Log Message:
-----------
Moved IQueryOver.OrderBy to more fluent syntax.
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs
trunk/nhibernate/src/NHibernate/IQueryOver.cs
trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs
trunk/nhibernate/src/NHibernate/NHibernate.csproj
trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs
trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs
Added Paths:
-----------
trunk/nhibernate/src/NHibernate/Criterion/QueryOverOrderBuilder.cs
Modified: trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2009-07-29 18:46:44 UTC (rev 4668)
+++ trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2009-07-30 09:56:14 UTC (rev 4669)
@@ -73,51 +73,51 @@
return this;
}
- public QueryOver<T> OrderBy(Expression<Func<T, object>> path, Func<string, Order> orderDelegate)
+ public QueryOverOrderBuilder<T> OrderBy(Expression<Func<T, object>> path)
{
- return AddOrder(path, orderDelegate);
+ return new QueryOverOrderBuilder<T>(this, path);
}
- public QueryOver<T> OrderBy(Expression<Func<object>> path, Func<string, Order> orderDelegate)
+ public QueryOverOrderBuilder<T> OrderBy(Expression<Func<object>> path)
{
- return AddOrder(path, orderDelegate);
+ return new QueryOverOrderBuilder<T>(this, path);
}
- public QueryOver<T> ThenBy(Expression<Func<T, object>> path, Func<string, Order> orderDelegate)
+ public QueryOverOrderBuilder<T> ThenBy(Expression<Func<T, object>> path)
{
- return AddOrder(path, orderDelegate);
+ return new QueryOverOrderBuilder<T>(this, path);
}
- public QueryOver<T> ThenBy(Expression<Func<object>> path, Func<string, Order> orderDelegate)
+ public QueryOverOrderBuilder<T> ThenBy(Expression<Func<object>> path)
{
- return AddOrder(path, orderDelegate);
+ return new QueryOverOrderBuilder<T>(this, path);
}
- public IQueryOver<T> Skip(int firstResult)
+ public QueryOver<T> Skip(int firstResult)
{
_criteria.SetFirstResult(firstResult);
return this;
}
- public IQueryOver<T> Take(int maxResults)
+ public QueryOver<T> Take(int maxResults)
{
_criteria.SetMaxResults(maxResults);
return this;
}
- public IQueryOver<T> Cacheable()
+ public QueryOver<T> Cacheable()
{
_criteria.SetCacheable(true);
return this;
}
- public IQueryOver<T> CacheMode(CacheMode cacheMode)
+ public QueryOver<T> CacheMode(CacheMode cacheMode)
{
_criteria.SetCacheMode(cacheMode);
return this;
}
- public IQueryOver<T> CacheRegion(string cacheRegion)
+ public QueryOver<T> CacheRegion(string cacheRegion)
{
_criteria.SetCacheRegion(cacheRegion);
return this;
@@ -260,19 +260,7 @@
return this;
}
- private QueryOver<T> AddOrder(Expression<Func<T, object>> path, Func<string, Order> orderDelegate)
- {
- _criteria.AddOrder(ExpressionProcessor.ProcessOrder<T>(path, orderDelegate));
- return this;
- }
- private QueryOver<T> AddOrder(Expression<Func<object>> path, Func<string, Order> orderDelegate)
- {
- _criteria.AddOrder(ExpressionProcessor.ProcessOrder(path, orderDelegate));
- return this;
- }
-
-
ICriteria IQueryOver<T>.UnderlyingCriteria
{ get { return UnderlyingCriteria; } }
@@ -291,17 +279,17 @@
IQueryOver<T> IQueryOver<T>.Select(params Expression<Func<T, object>>[] projections)
{ return Select(projections); }
- IQueryOver<T> IQueryOver<T>.OrderBy(Expression<Func<T, object>> path, Func<string, Order> orderDelegate)
- { return OrderBy(path, orderDelegate); }
+ IQueryOverOrderBuilder<T> IQueryOver<T>.OrderBy(Expression<Func<T, object>> path)
+ { return new IQueryOverOrderBuilder<T>(this, path); }
- IQueryOver<T> IQueryOver<T>.OrderBy(Expression<Func<object>> path, Func<string, Order> orderDelegate)
- { return OrderBy(path, orderDelegate); }
+ IQueryOverOrderBuilder<T> IQueryOver<T>.OrderBy(Expression<Func<object>> path)
+ { return new IQueryOverOrderBuilder<T>(this, path); }
- IQueryOver<T> IQueryOver<T>.ThenBy(Expression<Func<T, object>> path, Func<string, Order> orderDelegate)
- { return ThenBy(path, orderDelegate); }
+ IQueryOverOrderBuilder<T> IQueryOver<T>.ThenBy(Expression<Func<T, object>> path)
+ { return new IQueryOverOrderBuilder<T>(this, path); }
- IQueryOver<T> IQueryOver<T>.ThenBy(Expression<Func<object>> path, Func<string, Order> orderDelegate)
- { return ThenBy(path, orderDelegate); }
+ IQueryOverOrderBuilder<T> IQueryOver<T>.ThenBy(Expression<Func<object>> path)
+ { return new IQueryOverOrderBuilder<T>(this, path); }
IQueryOver<T> IQueryOver<T>.Skip(int firstResult)
{ return Skip(firstResult); }
Added: trunk/nhibernate/src/NHibernate/Criterion/QueryOverOrderBuilder.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Criterion/QueryOverOrderBuilder.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate/Criterion/QueryOverOrderBuilder.cs 2009-07-30 09:56:14 UTC (rev 4669)
@@ -0,0 +1,72 @@
+
+using System;
+using System.Collections.Generic;
+using System.Linq.Expressions;
+
+using NHibernate.Impl;
+using NHibernate.SqlCommand;
+
+namespace NHibernate.Criterion
+{
+
+ public class QueryOverOrderBuilder<T> : QueryOverOrderBuilderBase<QueryOver<T>, T>
+ {
+
+ public QueryOverOrderBuilder(QueryOver<T> root, Expression<Func<T, object>> path) : base(root, path)
+ {}
+
+ public QueryOverOrderBuilder(QueryOver<T> root, Expression<Func<object>> path) : base(root, path)
+ {}
+
+ }
+
+ public class IQueryOverOrderBuilder<T> : QueryOverOrderBuilderBase<IQueryOver<T>, T>
+ {
+
+ public IQueryOverOrderBuilder(IQueryOver<T> root, Expression<Func<T, object>> path) : base(root, path)
+ {}
+
+ public IQueryOverOrderBuilder(IQueryOver<T> root, Expression<Func<object>> path) : base(root, path)
+ {}
+
+ }
+
+ public class QueryOverOrderBuilderBase<R, T> where R : IQueryOver<T>
+ {
+
+ protected R root;
+ protected LambdaExpression path;
+
+ protected QueryOverOrderBuilderBase(R root, Expression<Func<T, object>> path)
+ {
+ this.root = root;
+ this.path = path;
+ }
+
+ protected QueryOverOrderBuilderBase(R root, Expression<Func<object>> path)
+ {
+ this.root = root;
+ this.path = path;
+ }
+
+ public R Asc
+ {
+ get
+ {
+ this.root.UnderlyingCriteria.AddOrder(ExpressionProcessor.ProcessOrder(path, Order.Asc));
+ return this.root;
+ }
+ }
+
+ public R Desc
+ {
+ get
+ {
+ this.root.UnderlyingCriteria.AddOrder(ExpressionProcessor.ProcessOrder(path, Order.Desc));
+ return this.root;
+ }
+ }
+
+ }
+
+}
Modified: trunk/nhibernate/src/NHibernate/IQueryOver.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/IQueryOver.cs 2009-07-29 18:46:44 UTC (rev 4668)
+++ trunk/nhibernate/src/NHibernate/IQueryOver.cs 2009-07-30 09:56:14 UTC (rev 4669)
@@ -68,33 +68,29 @@
/// Add order expressed as a lambda expression
/// </summary>
/// <param name="path">Lambda expression</param>
- /// <param name="orderDelegate">Order delegate (direction)</param>
/// <returns>criteria instance</returns>
- IQueryOver<T> OrderBy(Expression<Func<T, object>> path, Func<string, Order> orderDelegate);
+ IQueryOverOrderBuilder<T> OrderBy(Expression<Func<T, object>> path);
/// <summary>
/// Add order expressed as a lambda expression
/// </summary>
/// <param name="path">Lambda expression</param>
- /// <param name="orderDelegate">Order delegate (direction)</param>
/// <returns>criteria instance</returns>
- IQueryOver<T> OrderBy(Expression<Func<object>> path, Func<string, Order> orderDelegate);
+ IQueryOverOrderBuilder<T> OrderBy(Expression<Func<object>> path);
/// <summary>
/// Add order expressed as a lambda expression
/// </summary>
/// <param name="path">Lambda expression</param>
- /// <param name="orderDelegate">Order delegate (direction)</param>
/// <returns>criteria instance</returns>
- IQueryOver<T> ThenBy(Expression<Func<T, object>> path, Func<string, Order> orderDelegate);
+ IQueryOverOrderBuilder<T> ThenBy(Expression<Func<T, object>> path);
/// <summary>
/// Add order expressed as a lambda expression
/// </summary>
/// <param name="path">Lambda expression</param>
- /// <param name="orderDelegate">Order delegate (direction)</param>
/// <returns>criteria instance</returns>
- IQueryOver<T> ThenBy(Expression<Func<object>> path, Func<string, Order> orderDelegate);
+ IQueryOverOrderBuilder<T> ThenBy(Expression<Func<object>> path);
/// <summary>
/// Set the first result to be retrieved
Modified: trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2009-07-29 18:46:44 UTC (rev 4668)
+++ trunk/nhibernate/src/NHibernate/Impl/ExpressionProcessor.cs 2009-07-30 09:56:14 UTC (rev 4669)
@@ -419,6 +419,20 @@
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<string, Order> orderDelegate)
+ {
+ string property = FindMemberExpression(expression.Body);
+ Order order = orderDelegate(property);
+ return order;
+ }
+
private static AbstractCriterion ProcessSubqueryExpression(LambdaSubqueryType subqueryType,
BinaryExpression be)
{
Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-07-29 18:46:44 UTC (rev 4668)
+++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-07-30 09:56:14 UTC (rev 4669)
@@ -492,6 +492,7 @@
<Compile Include="Criterion\GroupedProjection.cs" />
<Compile Include="Criterion\IPropertyProjection.cs" />
<Compile Include="Criterion\QueryOverJoinBuilder.cs" />
+ <Compile Include="Criterion\QueryOverOrderBuilder.cs" />
<Compile Include="Dialect\MsSql2008Dialect.cs" />
<Compile Include="Dialect\InformixDialect0940.cs" />
<Compile Include="Dialect\InformixDialect1000.cs" />
Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2009-07-29 18:46:44 UTC (rev 4668)
+++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs 2009-07-30 09:56:14 UTC (rev 4669)
@@ -108,7 +108,7 @@
var actual =
s.QueryOver<Person>()
.Select(p => p.Age)
- .OrderBy(p => p.Age, Order.Asc)
+ .OrderBy(p => p.Age).Asc
.List<int>();
Assert.That(actual[0], Is.EqualTo(20));
@@ -133,7 +133,7 @@
s.QueryOver<Person>(() => personAlias)
.Select(p => p.Name,
p => personAlias.Age)
- .OrderBy(p => p.Age, Order.Asc)
+ .OrderBy(p => p.Age).Asc
.List<object[]>()
.Select(props => new {
TestName = (string)props[0],
Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2009-07-29 18:46:44 UTC (rev 4668)
+++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2009-07-30 09:56:14 UTC (rev 4669)
@@ -251,10 +251,10 @@
Person personAlias = null;
IQueryOver<Person> actual =
CreateTestQueryOver<Person>(() => personAlias)
- .OrderBy(p => p.Name, Order.Asc)
- .ThenBy(p => p.Age, Order.Desc)
- .ThenBy(() => personAlias.Name, Order.Desc)
- .ThenBy(() => personAlias.Age, Order.Asc);
+ .OrderBy(p => p.Name).Asc
+ .ThenBy(p => p.Age).Desc
+ .ThenBy(() => personAlias.Name).Desc
+ .ThenBy(() => personAlias.Age).Asc;
AssertCriteriaAreEqual(expected, actual);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|