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