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