33using System . Collections . Generic ;
44using System . Linq . Expressions ;
55using NHibernate . Linq . ResultOperators ;
6- using Remotion . Linq . Clauses . Expressions ;
7- using Remotion . Linq . Parsing . ExpressionTreeVisitors ;
6+ using Remotion . Linq . Clauses . ExpressionTreeVisitors ;
87
98namespace 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}
0 commit comments