|
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