private GroupByTransformationNode BindGroupByToken(GroupByToken token) { var properties = new List <GroupByPropertyNode>(); foreach (var propertyToken in token.Properties) { var bindResult = this.bindMethod(propertyToken); var property = bindResult as SingleValuePropertyAccessNode; if (property != null) { RegisterProperty(properties, ReversePropertyPath(property)); } else { var openProperty = bindResult as SingleValueOpenPropertyAccessNode; if (openProperty != null) { var type = GetTypeReferenceByPropertyName(openProperty.Name); properties.Add(new GroupByPropertyNode(openProperty.Name, openProperty, type)); } else { throw new ODataException( ODataErrorStrings.ApplyBinder_GroupByPropertyNotPropertyAccessValue(propertyToken.Identifier)); } } } TransformationNode aggregate = null; if (token.Child != null) { if (token.Child.Kind == QueryTokenKind.Aggregate) { aggregate = BindAggregateToken((AggregateToken)token.Child); aggregateStatementsCache = ((AggregateTransformationNode)aggregate).Statements; state.AggregatedProperties = aggregateStatementsCache.Select(statement => statement.AsAlias).ToList(); } else { throw new ODataException(ODataErrorStrings.ApplyBinder_UnsupportedGroupByChild(token.Child.Kind)); } } // TODO: Determine source return(new GroupByTransformationNode(properties, aggregate, null)); }