3
3
using System . Collections . Generic ;
4
4
using System . Linq . Expressions ;
5
5
using NHibernate . Linq . ResultOperators ;
6
- using Remotion . Linq . Clauses . Expressions ;
7
- using Remotion . Linq . Parsing . ExpressionTreeVisitors ;
6
+ using Remotion . Linq . Clauses . ExpressionTreeVisitors ;
8
7
9
8
namespace NHibernate . Linq . Visitors . ResultOperatorProcessors
10
9
{
11
10
public class ProcessNonAggregatingGroupBy : IResultOperatorProcessor < NonAggregatingGroupBy >
12
11
{
13
12
public void Process ( NonAggregatingGroupBy resultOperator , QueryModelVisitor queryModelVisitor , IntermediateHqlTree tree )
14
13
{
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 ;
18
21
19
22
// Stuff in the group by that doesn't map to HQL. Run it client-side
20
23
var listParameter = Expression . Parameter ( typeof ( IEnumerable < object > ) , "list" ) ;
21
24
22
- var keySelectorExpr = CreateSelector ( tSource , resultOperator . GroupBy . KeySelector ) ;
25
+ var keySelectorExpr = ReverseResolvingExpressionTreeVisitor . ReverseResolve ( selector , keySelector ) ;
23
26
24
- var elementSelectorExpr = CreateSelector ( tSource , resultOperator . GroupBy . ElementSelector ) ;
27
+ var elementSelectorExpr = ReverseResolvingExpressionTreeVisitor . ReverseResolve ( selector , elementSelector ) ;
25
28
26
29
var groupByMethod = EnumerableHelper . GetMethod ( "GroupBy" ,
27
30
new [ ] { typeof ( IEnumerable < > ) , typeof ( Func < , > ) , typeof ( Func < , > ) } ,
28
- new [ ] { tSource , tKey , tElement } ) ;
31
+ new [ ] { sourceType , keyType , elementType } ) ;
29
32
30
- var castToItem = EnumerableHelper . GetMethod ( "Cast" , new [ ] { typeof ( IEnumerable ) } , new [ ] { tSource } ) ;
33
+ var castToItem = EnumerableHelper . GetMethod ( "Cast" , new [ ] { typeof ( IEnumerable ) } , new [ ] { sourceType } ) ;
31
34
32
35
var toList = EnumerableHelper . GetMethod ( "ToList" , new [ ] { typeof ( IEnumerable < > ) } , new [ ] { resultOperator . GroupBy . ItemType } ) ;
33
36
@@ -41,32 +44,5 @@ public void Process(NonAggregatingGroupBy resultOperator, QueryModelVisitor quer
41
44
42
45
tree . AddListTransformer ( lambdaExpr ) ;
43
46
}
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
- }
71
47
}
72
48
}
0 commit comments