Skip to content

Commit 512f97c

Browse files
committed
Add support for select after nested group by
1 parent 501ed87 commit 512f97c

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -841,7 +841,7 @@ public void GroupByComputedValueFromNestedObjectSelect()
841841
}
842842

843843
[Test(Description="GH-3076")]
844-
public void NestedGroupBy()
844+
public void NestedNonAggregateGroupBy()
845845
{
846846
var list = db.OrderLines
847847
.GroupBy(x => new { x.Order.OrderId, x.Product.ProductId }) // this works fine
@@ -851,6 +851,18 @@ public void NestedGroupBy()
851851
Assert.That(list, Has.Count.EqualTo(77));
852852
}
853853

854+
[Test(Description="GH-3076")]
855+
public void NestedNonAggregateGroupBySelect()
856+
{
857+
var list = db.OrderLines
858+
.GroupBy(x => new { x.Order.OrderId, x.Product.ProductId }) // this works fine
859+
.GroupBy(x => x.Key.ProductId) // exception: "A recognition error occurred"
860+
.Select(x => new { ProductId = x })
861+
.ToList();
862+
863+
Assert.That(list, Has.Count.EqualTo(77));
864+
}
865+
854866
private static void CheckGrouping<TKey, TElement>(IEnumerable<IGrouping<TKey, TElement>> groupedItems, Func<TElement, TKey> groupBy)
855867
{
856868
var used = new HashSet<object>();

src/NHibernate/Linq/GroupBy/NonAggregatingGroupByRewriter.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,19 @@ public static void ReWrite(QueryModel queryModel)
1818
&& queryModel.ResultOperators.All(r => r is GroupResultOperator)
1919
&& IsNonAggregatingGroupBy(queryModel))
2020
{
21-
var source = queryModel.SelectClause.Selector;
22-
for (var index = 0; index < queryModel.ResultOperators.Count; index++)
21+
for (var i = 0; i < queryModel.ResultOperators.Count; i++)
2322
{
24-
var r = (GroupResultOperator) queryModel.ResultOperators[index];
25-
queryModel.ResultOperators[index] = new NonAggregatingGroupBy(r);
26-
source = new QuerySourceReferenceExpression(r);
23+
var r = (GroupResultOperator) queryModel.ResultOperators[i];
24+
queryModel.ResultOperators[i] = new NonAggregatingGroupBy(r);
2725
}
2826

2927
return;
3028
}
3129

32-
if ((queryModel.MainFromClause.FromExpression is SubQueryExpression subQueryExpression)
33-
&& (subQueryExpression.QueryModel.ResultOperators.Count == 1)
34-
&& (subQueryExpression.QueryModel.ResultOperators[0] is GroupResultOperator)
35-
&& (IsNonAggregatingGroupBy(queryModel)))
30+
if (queryModel.MainFromClause.FromExpression is SubQueryExpression subQueryExpression
31+
&& subQueryExpression.QueryModel.ResultOperators.Count > 0
32+
&& subQueryExpression.QueryModel.ResultOperators.All(r => r is GroupResultOperator)
33+
&& IsNonAggregatingGroupBy(queryModel))
3634
{
3735
FlattenSubQuery(subQueryExpression, queryModel);
3836
}
@@ -62,7 +60,11 @@ private static void FlattenSubQuery(SubQueryExpression subQueryExpression, Query
6260
throw new NotImplementedException();
6361
}
6462

65-
queryModel.ResultOperators.Add(new NonAggregatingGroupBy((GroupResultOperator) subQueryModel.ResultOperators[0]));
63+
for (var i = 0; i < subQueryModel.ResultOperators.Count; i++)
64+
{
65+
queryModel.ResultOperators.Add(new NonAggregatingGroupBy((GroupResultOperator) subQueryModel.ResultOperators[i]));
66+
}
67+
6668
queryModel.ResultOperators.Add(clientSideSelect);
6769
}
6870

0 commit comments

Comments
 (0)