@@ -13,7 +13,8 @@ namespace NHibernate.Linq
1313{
1414 public interface INhQueryProvider : IQueryProvider
1515 {
16- object ExecuteFuture ( Expression expression ) ;
16+ IEnumerable < TResult > ExecuteFuture < TResult > ( Expression expression ) ;
17+ IFutureValue < TResult > ExecuteFutureValue < TResult > ( Expression expression ) ;
1718 void SetResultTransformerAndAdditionalCriteria ( IQuery query , NhLinqExpression nhExpression , IDictionary < string , Tuple < object , IType > > parameters ) ;
1819 }
1920
@@ -59,12 +60,32 @@ public virtual IQueryable<T> CreateQuery<T>(Expression expression)
5960 return new NhQueryable < T > ( this , expression ) ;
6061 }
6162
62- public virtual object ExecuteFuture ( Expression expression )
63+ public virtual IEnumerable < TResult > ExecuteFuture < TResult > ( Expression expression )
6364 {
64- IQuery query ;
65- NhLinqExpression nhQuery ;
66- NhLinqExpression nhLinqExpression = PrepareQuery ( expression , out query , out nhQuery ) ;
67- return ExecuteFutureQuery ( nhLinqExpression , query , nhQuery ) ;
65+ PrepareQuery ( expression , out var query , out var nhQuery ) ;
66+
67+ var result = query . Future < TResult > ( ) ;
68+ SetupFutureResult ( nhQuery , ( IDelayedValue ) result ) ;
69+
70+ return result ;
71+ }
72+
73+ public virtual IFutureValue < TResult > ExecuteFutureValue < TResult > ( Expression expression )
74+ {
75+ PrepareQuery ( expression , out var query , out var nhQuery ) ;
76+
77+ var result = query . FutureValue < TResult > ( ) ;
78+ SetupFutureResult ( nhQuery , ( IDelayedValue ) result ) ;
79+
80+ return result ;
81+ }
82+
83+ private static void SetupFutureResult ( NhLinqExpression nhQuery , IDelayedValue result )
84+ {
85+ if ( nhQuery . ExpressionToHqlTranslationResults . PostExecuteTransformer == null )
86+ return ;
87+
88+ result . ExecuteOnEval = nhQuery . ExpressionToHqlTranslationResults . PostExecuteTransformer ;
6889 }
6990
7091 protected virtual NhLinqExpression PrepareQuery ( Expression expression , out IQuery query , out NhLinqExpression nhQuery )
@@ -80,24 +101,6 @@ protected virtual NhLinqExpression PrepareQuery(Expression expression, out IQuer
80101 return nhLinqExpression ;
81102 }
82103
83- private static readonly MethodInfo Future = ReflectHelper . GetMethodDefinition < IQuery > ( q => q . Future < object > ( ) ) ;
84- private static readonly MethodInfo FutureValue = ReflectHelper . GetMethodDefinition < IQuery > ( q => q . FutureValue < object > ( ) ) ;
85-
86- protected virtual object ExecuteFutureQuery ( NhLinqExpression nhLinqExpression , IQuery query , NhLinqExpression nhQuery )
87- {
88- var method = ( nhLinqExpression . ReturnType == NhLinqExpressionReturnType . Sequence ? Future : FutureValue )
89- . MakeGenericMethod ( nhQuery . Type ) ;
90-
91- object result = method . Invoke ( query , new object [ 0 ] ) ;
92-
93- if ( nhQuery . ExpressionToHqlTranslationResults . PostExecuteTransformer != null )
94- {
95- ( ( IDelayedValue ) result ) . ExecuteOnEval = nhQuery . ExpressionToHqlTranslationResults . PostExecuteTransformer ;
96- }
97-
98- return result ;
99- }
100-
101104 protected virtual object ExecuteQuery ( NhLinqExpression nhLinqExpression , IQuery query , NhLinqExpression nhQuery )
102105 {
103106 IList results = query . List ( ) ;
0 commit comments