Skip to content

Commit e084a8a

Browse files
committed
Correctly set source for chained group by operators
1 parent c7726c2 commit e084a8a

File tree

4 files changed

+23
-12
lines changed

4 files changed

+23
-12
lines changed

src/NHibernate.Test/Linq/ByMethod/GroupByTests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -847,6 +847,8 @@ public void NestedGroupBy()
847847
.GroupBy(x => new { x.Order.OrderId, x.Product.ProductId }) // this works fine
848848
.GroupBy(x => x.Key.ProductId) // exception: "A recognition error occurred"
849849
.ToList();
850+
851+
Assert.That(list, Has.Count.EqualTo(77));
850852
}
851853

852854
private static void CheckGrouping<TKey, TElement>(IEnumerable<IGrouping<TKey, TElement>> groupedItems, Func<TElement, TKey> groupBy)

src/NHibernate/Linq/GroupBy/NonAggregatingGroupByRewriter.cs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Linq;
33
using System.Linq.Expressions;
44
using NHibernate.Linq.ResultOperators;
5-
using NHibernate.Util;
65
using Remotion.Linq;
76
using Remotion.Linq.Clauses;
87
using Remotion.Linq.Clauses.ExpressionVisitors;
@@ -18,13 +17,12 @@ public static void ReWrite(QueryModel queryModel)
1817
if (queryModel.ResultOperators.All(r => r is GroupResultOperator)
1918
&& IsNonAggregatingGroupBy(queryModel))
2019
{
21-
var resultOperators = queryModel.ResultOperators
22-
.ToArray(r => new NonAggregatingGroupBy((GroupResultOperator) r));
23-
24-
queryModel.ResultOperators.Clear();
25-
foreach (var resultOperator in resultOperators)
20+
var source = queryModel.SelectClause.Selector;
21+
for (var index = 0; index < queryModel.ResultOperators.Count; index++)
2622
{
27-
queryModel.ResultOperators.Add(resultOperator);
23+
var r = (GroupResultOperator) queryModel.ResultOperators[index];
24+
queryModel.ResultOperators[index] = new NonAggregatingGroupBy(r, source);
25+
source = new QuerySourceReferenceExpression(r);
2826
}
2927

3028
return;
@@ -65,7 +63,7 @@ private static void FlattenSubQuery(SubQueryExpression subQueryExpression, Query
6563
throw new NotImplementedException();
6664
}
6765

68-
queryModel.ResultOperators.Add(new NonAggregatingGroupBy((GroupResultOperator) subQueryModel.ResultOperators[0]));
66+
queryModel.ResultOperators.Add(new NonAggregatingGroupBy((GroupResultOperator) subQueryModel.ResultOperators[0], queryModel.SelectClause.Selector));
6967
queryModel.ResultOperators.Add(clientSideSelect);
7068
}
7169

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,25 @@
1+
using System;
2+
using System.Linq.Expressions;
13
using Remotion.Linq.Clauses.ResultOperators;
24

35
namespace NHibernate.Linq.ResultOperators
46
{
57
public class NonAggregatingGroupBy : ClientSideTransformOperator
68
{
7-
public NonAggregatingGroupBy(GroupResultOperator groupBy)
9+
//Since v5.4
10+
[Obsolete("Please use another constructor")]
11+
public NonAggregatingGroupBy(GroupResultOperator groupBy) : this(groupBy, null)
12+
{
13+
}
14+
15+
public NonAggregatingGroupBy(GroupResultOperator groupBy, Expression source)
816
{
917
GroupBy = groupBy;
18+
Source = source;
1019
}
1120

12-
public GroupResultOperator GroupBy { get; private set; }
21+
public GroupResultOperator GroupBy { get; }
22+
23+
public Expression Source { get; }
1324
}
14-
}
25+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class ProcessNonAggregatingGroupBy : IResultOperatorProcessor<NonAggregat
1111
{
1212
public void Process(NonAggregatingGroupBy resultOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
1313
{
14-
var selector = queryModelVisitor.Model.SelectClause.Selector;
14+
var selector = resultOperator.Source;
1515
var keySelector = resultOperator.GroupBy.KeySelector;
1616
var elementSelector = resultOperator.GroupBy.ElementSelector;
1717

0 commit comments

Comments
 (0)