Skip to content

Commit 3f4c5ba

Browse files
NH-4030 - further simplifying Linq Future implementation.
1 parent c999b94 commit 3f4c5ba

File tree

2 files changed

+31
-34
lines changed

2 files changed

+31
-34
lines changed

src/NHibernate/Linq/DefaultQueryProvider.cs

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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();

src/NHibernate/Linq/LinqExtensionMethods.cs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,7 @@ public static IEnumerable<TSource> ToFuture<TSource>(this IQueryable<TSource> so
9999
{
100100
throw new NotSupportedException($"Source {nameof(source.Provider)} must be a {nameof(INhQueryProvider)}");
101101
}
102-
var future = provider.ExecuteFuture(source.Expression);
103-
return (IEnumerable<TSource>)future;
102+
return provider.ExecuteFuture<TSource>(source.Expression);
104103
}
105104

106105
/// <summary>
@@ -122,13 +121,8 @@ public static IFutureValue<TSource> ToFutureValue<TSource>(this IQueryable<TSour
122121
{
123122
throw new NotSupportedException($"Source {nameof(source.Provider)} must be a {nameof(INhQueryProvider)}");
124123
}
125-
var future = provider.ExecuteFuture(source.Expression);
126-
if (future is IEnumerable<TSource> enumerable)
127-
{
128-
return new FutureValue<TSource>(() => enumerable);
129-
}
130-
131-
return (IFutureValue<TSource>)future;
124+
var future = provider.ExecuteFuture<TSource>(source.Expression);
125+
return new FutureValue<TSource>(() => future);
132126
}
133127

134128
/// <summary>
@@ -156,7 +150,7 @@ public static IFutureValue<TResult> ToFutureValue<TSource, TResult>(this IQuerya
156150
var expression = ReplacingExpressionTreeVisitor
157151
.Replace(selector.Parameters.Single(), source.Expression, selector.Body);
158152

159-
return (IFutureValue<TResult>)provider.ExecuteFuture(expression);
153+
return provider.ExecuteFutureValue<TResult>(expression);
160154
}
161155

162156
public static T MappedAs<T>(this T parameter, IType type)

0 commit comments

Comments
 (0)