Skip to content

Commit dcc553e

Browse files
committed
Resolve Key and Element selectors with standard re-linq's ReverseResolvingExpressionTreeVisitor in ProcessNonAggregatingGroupBy
1 parent 3db2893 commit dcc553e

File tree

3 files changed

+12
-64
lines changed

3 files changed

+12
-64
lines changed

src/NHibernate/Linq/Visitors/GroupByKeySelectorVisitor.cs

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessNonAggregatingGroupBy.cs

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,34 @@
33
using System.Collections.Generic;
44
using System.Linq.Expressions;
55
using NHibernate.Linq.ResultOperators;
6-
using Remotion.Linq.Clauses.Expressions;
7-
using Remotion.Linq.Parsing.ExpressionTreeVisitors;
6+
using Remotion.Linq.Clauses.ExpressionTreeVisitors;
87

98
namespace NHibernate.Linq.Visitors.ResultOperatorProcessors
109
{
1110
public class ProcessNonAggregatingGroupBy : IResultOperatorProcessor<NonAggregatingGroupBy>
1211
{
1312
public void Process(NonAggregatingGroupBy resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
1413
{
15-
var tSource = queryModelVisitor.Model.SelectClause.Selector.Type;
16-
var tKey = resultOperator.GroupBy.KeySelector.Type;
17-
var tElement = resultOperator.GroupBy.ElementSelector.Type;
14+
var selector = queryModelVisitor.Model.SelectClause.Selector;
15+
var keySelector = resultOperator.GroupBy.KeySelector;
16+
var elementSelector = resultOperator.GroupBy.ElementSelector;
17+
18+
var sourceType = selector.Type;
19+
var keyType = keySelector.Type;
20+
var elementType = elementSelector.Type;
1821

1922
// Stuff in the group by that doesn't map to HQL. Run it client-side
2023
var listParameter = Expression.Parameter(typeof(IEnumerable<object>), "list");
2124

22-
var keySelectorExpr = CreateSelector(tSource, resultOperator.GroupBy.KeySelector);
25+
var keySelectorExpr = ReverseResolvingExpressionTreeVisitor.ReverseResolve(selector, keySelector);
2326

24-
var elementSelectorExpr = CreateSelector(tSource, resultOperator.GroupBy.ElementSelector);
27+
var elementSelectorExpr = ReverseResolvingExpressionTreeVisitor.ReverseResolve(selector, elementSelector);
2528

2629
var groupByMethod = EnumerableHelper.GetMethod("GroupBy",
2730
new[] { typeof(IEnumerable<>), typeof(Func<,>), typeof(Func<,>) },
28-
new[] { tSource, tKey, tElement });
31+
new[] { sourceType, keyType, elementType });
2932

30-
var castToItem = EnumerableHelper.GetMethod("Cast", new[] { typeof(IEnumerable) }, new[] { tSource });
33+
var castToItem = EnumerableHelper.GetMethod("Cast", new[] { typeof(IEnumerable) }, new[] { sourceType });
3134

3235
var toList = EnumerableHelper.GetMethod("ToList", new[] { typeof(IEnumerable<>) }, new[] { resultOperator.GroupBy.ItemType });
3336

@@ -41,32 +44,5 @@ public void Process(NonAggregatingGroupBy resultOperator, QueryModelVisitor quer
4144

4245
tree.AddListTransformer(lambdaExpr);
4346
}
44-
45-
private static LambdaExpression CreateSelector(System.Type sourceType, Expression selector)
46-
{
47-
var parameter = Expression.Parameter(sourceType, "item");
48-
49-
var querySource = GetQuerySourceReferenceExpression(selector);
50-
51-
Expression selectorBody;
52-
if (sourceType != querySource.Type)
53-
{
54-
//TODO: it looks like some "magic".
55-
var member = sourceType.GetMember(((QuerySourceReferenceExpression) selector).ReferencedQuerySource.ItemName)[0];
56-
57-
selectorBody = Expression.MakeMemberAccess(parameter, member);
58-
}
59-
else
60-
{
61-
selectorBody = ReplacingExpressionTreeVisitor.Replace(querySource, parameter, selector);
62-
}
63-
64-
return Expression.Lambda(selectorBody, parameter);
65-
}
66-
67-
private static Expression GetQuerySourceReferenceExpression(Expression keySelector)
68-
{
69-
return new GroupByKeySourceFinder().Visit(keySelector);
70-
}
7147
}
7248
}

src/NHibernate/NHibernate.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1013,7 +1013,6 @@
10131013
<Compile Include="Linq\ExpressionToHqlTranslationResults.cs" />
10141014
<Compile Include="Linq\EnumerableHelper.cs" />
10151015
<Compile Include="Linq\GroupBy\GroupBySelectClauseRewriter.cs" />
1016-
<Compile Include="Linq\Visitors\GroupByKeySelectorVisitor.cs" />
10171016
<Compile Include="Linq\Visitors\HqlGeneratorExpressionTreeVisitor.cs" />
10181017
<Compile Include="Linq\LinqExtensionMethods.cs" />
10191018
<Compile Include="Linq\ReWriters\MergeAggregatingResultsRewriter.cs" />

0 commit comments

Comments
 (0)