From: <Ric...@us...> - 2009-06-29 18:52:41
|
Revision: 4543 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4543&view=rev Author: RicBrown Date: 2009-06-29 18:52:24 +0000 (Mon, 29 Jun 2009) Log Message: ----------- Added first cut of Join() to ICriteria<T>. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/ICriteriaOfT.cs trunk/nhibernate/src/NHibernate/Impl/CriteriaOfTImpl.cs trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/CriteriaOfTFixture.cs Modified: trunk/nhibernate/src/NHibernate/ICriteriaOfT.cs =================================================================== --- trunk/nhibernate/src/NHibernate/ICriteriaOfT.cs 2009-06-29 18:10:53 UTC (rev 4542) +++ trunk/nhibernate/src/NHibernate/ICriteriaOfT.cs 2009-06-29 18:52:24 UTC (rev 4543) @@ -53,23 +53,31 @@ /// Creates a new NHibernate.ICriteria<T>, "rooted" at the associated entity /// </summary> /// <typeparam name="U">Type of sub-criteria</typeparam> - /// <param name="expression">Lambda expression returning association path</param> + /// <param name="path">Lambda expression returning association path</param> /// <returns>The created "sub criteria"</returns> - ICriteria<U> Join<U>(Expression<Func<T, U>> expression); + ICriteria<U> JoinWalk<U>(Expression<Func<T, U>> path); /// <summary> /// Creates a new NHibernate.ICriteria<T>, "rooted" at the associated entity /// specifying a collection for the join. /// </summary> /// <typeparam name="U">Type of sub-criteria (type of the collection)</typeparam> - /// <param name="expression">Lambda expression returning association path</param> + /// <param name="path">Lambda expression returning association path</param> /// <returns>The created "sub criteria"</returns> - ICriteria<U> Join<U>(Expression<Func<T, IEnumerable<U>>> expression); + ICriteria<U> JoinWalk<U>(Expression<Func<T, IEnumerable<U>>> path); /// <summary> + /// Join an association, assigning an alias to the joined entity + /// </summary> + /// <param name="path">Lambda expression returning association path</param> + /// <param name="alias">Lambda expression returning alias reference</param> + /// <returns>criteria instance</returns> + ICriteria<T> Join(Expression<Func<T, object>> path, Expression<Func<object>> alias); + + /// <summary> /// Get the results of the root type and fill the <see cref="IList<T>"/> /// </summary> - /// <param name="results">The list filled with the results.</param> + /// <returns>The list filled with the results.</returns> IList<T> List(); } Modified: trunk/nhibernate/src/NHibernate/Impl/CriteriaOfTImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/CriteriaOfTImpl.cs 2009-06-29 18:10:53 UTC (rev 4542) +++ trunk/nhibernate/src/NHibernate/Impl/CriteriaOfTImpl.cs 2009-06-29 18:52:24 UTC (rev 4543) @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using NHibernate.SqlCommand; namespace NHibernate.Impl { @@ -45,25 +46,39 @@ return Add(expression); } - ICriteria<U> ICriteria<T>.Join<U>(Expression<Func<T, U>> expression) + ICriteria<U> ICriteria<T>.JoinWalk<U>(Expression<Func<T, U>> path) { return new CriteriaImpl<U>( _criteria.CreateCriteria( - ExpressionProcessor.FindMemberExpression(expression.Body))); + ExpressionProcessor.FindMemberExpression(path.Body))); } - ICriteria<U> ICriteria<T>.Join<U>(Expression<Func<T, IEnumerable<U>>> expression) + ICriteria<U> ICriteria<T>.JoinWalk<U>(Expression<Func<T, IEnumerable<U>>> path) { return new CriteriaImpl<U>( _criteria.CreateCriteria( - ExpressionProcessor.FindMemberExpression(expression.Body))); + ExpressionProcessor.FindMemberExpression(path.Body))); } + ICriteria<T> ICriteria<T>.Join(Expression<Func<T, object>> path, Expression<Func<object>> alias) + { + return AddAlias( + ExpressionProcessor.FindMemberExpression(path.Body), + ExpressionProcessor.FindMemberExpression(alias.Body), + JoinType.InnerJoin); + } + IList<T> ICriteria<T>.List() { return _criteria.List<T>(); } + private CriteriaImpl<T> AddAlias(string path, string alias, JoinType joinType) + { + _criteria.CreateAlias(path, alias, joinType); + return this; + } + private CriteriaImpl<T> Add(Expression<Func<T, bool>> expression) { _criteria.Add(ExpressionProcessor.ProcessExpression<T>(expression)); Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/CriteriaOfTFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/CriteriaOfTFixture.cs 2009-06-29 18:10:53 UTC (rev 4542) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/CriteriaOfTFixture.cs 2009-06-29 18:52:24 UTC (rev 4543) @@ -62,7 +62,7 @@ } [Test] - public void SubCriteria_Join_ToOne() + public void SubCriteria_JoinWalk_ToOne() { ICriteria expected = CreateTestCriteria(typeof(Person)) @@ -71,14 +71,14 @@ ICriteria<Person> actual = CreateTestQueryOver<Person>() - .Join(p => p.Father) // sub-criteria + .JoinWalk(p => p.Father) // sub-criteria .Where(f => f.Name == "test name"); AssertCriteriaAreEqual(expected, actual); } [Test] - public void SubCriteria_Join_ToMany() + public void SubCriteria_JoinWalk_ToMany() { ICriteria expected = CreateTestCriteria(typeof(Person)) @@ -87,12 +87,30 @@ ICriteria<Child> actual = CreateTestQueryOver<Person>() - .Join<Child>(p => p.Children) // sub-criteria + .JoinWalk<Child>(p => p.Children) // sub-criteria .Where(c => c.Nickname == "test name"); AssertCriteriaAreEqual(expected, actual); } + [Test] + public void Alias_Join() + { + ICriteria expected = + CreateTestCriteria(typeof(Person)) + .CreateAlias("Father", "fatherAlias") + .CreateAlias("Children", "childAlias"); + + Person fatherAlias = null; + Child childAlias = null; + ICriteria<Person> actual = + CreateTestQueryOver<Person>() + .Join(p => p.Father, () => fatherAlias) + .Join(p => p.Children, () => childAlias); + + AssertCriteriaAreEqual(expected, actual); + } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |