public static Expression FlattenGroupingKey(Expression expression) { var visitor = new GroupingKeyFlattener(); expression = visitor.Visit(expression); if (visitor._flattened) { expression = TransparentIdentifierRemovingExpressionVisitor.ReplaceTransparentIdentifiers(expression); // When the grouping key is an array we have to unwrap it (e.g. group.Key[0] == variable) if (expression.NodeType == ExpressionType.ArrayIndex && expression is BinaryExpression binaryExpression && binaryExpression.Left is NewArrayExpression newArray && binaryExpression.Right is ConstantExpression indexExpression && indexExpression.Value is int index) { return newArray.Expressions[index]; } } return expression; }
private static bool TryGetAllMemberMetadata( Expression expression, Stack<MemberMetadata> memberPaths, System.Type convertType, bool hasIndexer, out MemberMetadataResult results) { expression = GroupingKeyFlattener.FlattenGroupingKey(expression); var extractor = new MemberMetadataExtractor(memberPaths, convertType, hasIndexer); extractor.Accept(expression); results = extractor._entityName != null || extractor._childrenResults.Count > 0 ? new MemberMetadataResult( extractor._childrenResults, extractor._memberPaths, extractor._entityName, extractor._convertType) : null; return results != null; }