Exemplo n.º 1
0
			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;
			}
Exemplo n.º 2
0
			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;
			}