|
17 | 17 | using Remotion.Linq.Clauses; |
18 | 18 | using Remotion.Linq.Clauses.Expressions; |
19 | 19 | using Remotion.Linq.Clauses.ResultOperators; |
20 | | -using Remotion.Linq.Parsing; |
| 20 | +using TransparentIdentifierRemovingExpressionVisitor = NHibernate.Linq.Visitors.TransparentIdentifierRemovingExpressionVisitor; |
21 | 21 |
|
22 | 22 | namespace NHibernate.Util |
23 | 23 | { |
@@ -594,6 +594,43 @@ private static IType GetType( |
594 | 594 | : TypeFactory.GetDefaultTypeFor(member.ConvertType); // (long)q.OneToMany[0] |
595 | 595 | } |
596 | 596 |
|
| 597 | + private class GroupingKeyFlattener : NhExpressionVisitor |
| 598 | + { |
| 599 | + private bool _flattened; |
| 600 | + |
| 601 | + public static Expression FlattenGroupingKey(Expression expression) |
| 602 | + { |
| 603 | + var visitor = new GroupingKeyFlattener(); |
| 604 | + expression = visitor.Visit(expression); |
| 605 | + if (visitor._flattened) |
| 606 | + { |
| 607 | + expression = TransparentIdentifierRemovingExpressionVisitor.ReplaceTransparentIdentifiers(expression); |
| 608 | + // When the grouping key is an array we have to unwrap it (e.g. group.Key[0] == variable) |
| 609 | + if (expression.NodeType == ExpressionType.ArrayIndex && |
| 610 | + expression is BinaryExpression binaryExpression && |
| 611 | + binaryExpression.Left is NewArrayExpression newArray && |
| 612 | + binaryExpression.Right is ConstantExpression indexExpression && |
| 613 | + indexExpression.Value is int index) |
| 614 | + { |
| 615 | + return newArray.Expressions[index]; |
| 616 | + } |
| 617 | + } |
| 618 | + |
| 619 | + return expression; |
| 620 | + } |
| 621 | + |
| 622 | + protected override Expression VisitMember(MemberExpression node) |
| 623 | + { |
| 624 | + if (node.TryGetGroupResultOperator(out var groupBy)) |
| 625 | + { |
| 626 | + _flattened = true; |
| 627 | + return groupBy.KeySelector; |
| 628 | + } |
| 629 | + |
| 630 | + return base.VisitMember(node); |
| 631 | + } |
| 632 | + } |
| 633 | + |
597 | 634 | private class MemberMetadataExtractor : NhExpressionVisitor |
598 | 635 | { |
599 | 636 | private readonly List<MemberMetadataResult> _childrenResults = new List<MemberMetadataResult>(); |
@@ -639,6 +676,8 @@ private static bool TryGetAllMemberMetadata( |
639 | 676 | bool hasIndexer, |
640 | 677 | out MemberMetadataResult results) |
641 | 678 | { |
| 679 | + expression = GroupingKeyFlattener.FlattenGroupingKey(expression); |
| 680 | + |
642 | 681 | var extractor = new MemberMetadataExtractor(memberPaths, convertType, hasIndexer); |
643 | 682 | extractor.Accept(expression); |
644 | 683 | results = extractor._entityName != null || extractor._childrenResults.Count > 0 |
|
0 commit comments