From: <ric...@us...> - 2009-07-30 16:10:20
|
Revision: 4670 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4670&view=rev Author: ricbrown Date: 2009-07-30 16:10:11 +0000 (Thu, 30 Jul 2009) Log Message: ----------- Added IQueryOver.Fetch(...) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs trunk/nhibernate/src/NHibernate/IQueryOver.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Criterion/QueryOverFetchBuilder.cs Modified: trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2009-07-30 09:56:14 UTC (rev 4669) +++ trunk/nhibernate/src/NHibernate/Criterion/QueryOver.cs 2009-07-30 16:10:11 UTC (rev 4670) @@ -123,6 +123,11 @@ return this; } + public QueryOverFetchBuilder<T> Fetch(Expression<Func<T, object>> path) + { + return new QueryOverFetchBuilder<T>(this, path); + } + public QueryOver<U> JoinQueryOver<U>(Expression<Func<T, U>> path) { return new QueryOver<U>(_impl, @@ -306,6 +311,9 @@ IQueryOver<T> IQueryOver<T>.CacheRegion(string cacheRegion) { return CacheRegion(cacheRegion); } + IQueryOverFetchBuilder<T> IQueryOver<T>.Fetch(Expression<Func<T, object>> path) + { return new IQueryOverFetchBuilder<T>(this, path); } + IQueryOver<U> IQueryOver<T>.JoinQueryOver<U>(Expression<Func<T, U>> path) { return JoinQueryOver(path); } Added: trunk/nhibernate/src/NHibernate/Criterion/QueryOverFetchBuilder.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Criterion/QueryOverFetchBuilder.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Criterion/QueryOverFetchBuilder.cs 2009-07-30 16:10:11 UTC (rev 4670) @@ -0,0 +1,69 @@ + +using System; +using System.Collections.Generic; +using System.Linq.Expressions; + +using NHibernate.Impl; +using NHibernate.SqlCommand; + +namespace NHibernate.Criterion +{ + + public class QueryOverFetchBuilder<T> : QueryOverFetchBuilderBase<QueryOver<T>, T> + { + + public QueryOverFetchBuilder(QueryOver<T> root, Expression<Func<T, object>> path) + : base(root, path) { } + + } + + public class IQueryOverFetchBuilder<T> : QueryOverFetchBuilderBase<IQueryOver<T>, T> + { + + public IQueryOverFetchBuilder(IQueryOver<T> root, Expression<Func<T, object>> path) + : base(root, path) { } + + } + + public class QueryOverFetchBuilderBase<R, T> where R : IQueryOver<T> + { + + protected R root; + protected string path; + + protected QueryOverFetchBuilderBase(R root, Expression<Func<T, object>> path) + { + this.root = root; + this.path = ExpressionProcessor.FindMemberExpression(path.Body); + } + + public R Eager + { + get + { + this.root.UnderlyingCriteria.SetFetchMode(path, FetchMode.Eager); + return this.root; + } + } + + public R Lazy + { + get + { + this.root.UnderlyingCriteria.SetFetchMode(path, FetchMode.Lazy); + return this.root; + } + } + + public R Default + { + get + { + this.root.UnderlyingCriteria.SetFetchMode(path, FetchMode.Default); + return this.root; + } + } + + } + +} Modified: trunk/nhibernate/src/NHibernate/IQueryOver.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IQueryOver.cs 2009-07-30 09:56:14 UTC (rev 4669) +++ trunk/nhibernate/src/NHibernate/IQueryOver.cs 2009-07-30 16:10:11 UTC (rev 4670) @@ -122,6 +122,14 @@ IQueryOver<T> CacheRegion(string cacheRegion); /// <summary> + /// Specify an association fetching strategy. Currently, only + /// one-to-many and one-to-one associations are supported. + /// </summary> + /// <param name="path">A lambda expression path (e.g., ChildList[0].Granchildren[0].Pets).</param> + /// <returns></returns> + IQueryOverFetchBuilder<T> Fetch(Expression<Func<T, object>> path); + + /// <summary> /// Creates a new NHibernate.ICriteria<T>, "rooted" at the associated entity /// </summary> /// <typeparam name="U">Type of sub-criteria</typeparam> Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-07-30 09:56:14 UTC (rev 4669) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-07-30 16:10:11 UTC (rev 4670) @@ -491,6 +491,7 @@ <Compile Include="Cfg\MappingSchema\IDecoratable.cs" /> <Compile Include="Criterion\GroupedProjection.cs" /> <Compile Include="Criterion\IPropertyProjection.cs" /> + <Compile Include="Criterion\QueryOverFetchBuilder.cs" /> <Compile Include="Criterion\QueryOverJoinBuilder.cs" /> <Compile Include="Criterion\QueryOverOrderBuilder.cs" /> <Compile Include="Dialect\MsSql2008Dialect.cs" /> Modified: trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2009-07-30 09:56:14 UTC (rev 4669) +++ trunk/nhibernate/src/NHibernate.Test/Criteria/Lambda/QueryOverFixture.cs 2009-07-30 16:10:11 UTC (rev 4670) @@ -315,6 +315,22 @@ AssertCriteriaAreEqual(expected, actual); } + [Test] + public void Fetch() + { + ICriteria expected = + CreateTestCriteria(typeof(Person)) + .SetFetchMode("PersonList", FetchMode.Eager) + .SetFetchMode("PersonList.PersonList", FetchMode.Lazy); + + IQueryOver<Person> actual = + CreateTestQueryOver<Person>() + .Fetch(p => p.PersonList).Eager + .Fetch(p => p.PersonList[0].PersonList).Lazy; + + 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. |