/// <summary> /// Bind an orderby option /// </summary> /// <param name="syntax">a syntac tree containing the orderby option</param> /// <param name="rangeVariable">the range variable that iterates over the top level collection</param> /// <param name="path">the top level path</param> /// <returns>an OrderByClause representing this orderby option</returns> public OrderByClause BindOrderBy(SyntacticTree syntax, RangeVariable rangeVariable, ODataPath path) { if (syntax.OrderByTokens != null && syntax.OrderByTokens.Any()) { if (rangeVariable == null || !path.EdmType().IsEntityCollection()) { throw new ODataException(ODataErrorStrings.MetadataBinder_QueryOptionNotApplicable("$orderby")); } OrderByBinder orderByBinder = new OrderByBinder(this.bindMethod); return(orderByBinder.BindOrderBy(this.bindingState, syntax.OrderByTokens)); } return(null); }
/// <summary> /// Parses a <paramref name="orderBy "/> clause on the given <paramref name="elementType"/>, binding /// the text into semantic nodes using the provided model. /// </summary> /// <param name="orderBy">String representation of the orderby expression.</param> /// <param name="elementType">Type that the orderby clause refers to.</param> /// <param name="entitySet">EntitySet that the elements beign filtered are from.</param> /// <returns>A <see cref="OrderByClause"/> representing the metadata bound orderby expression.</returns> private OrderByClause ParseOrderByImplementation(string orderBy, IEdmType elementType, IEdmEntitySet entitySet) { ExceptionUtils.CheckArgumentNotNull(this.configuration.Model, "model"); ExceptionUtils.CheckArgumentNotNull(elementType, "elementType"); ExceptionUtils.CheckArgumentNotNull(orderBy, "orderBy"); // Get the syntactic representation of the filter expression UriQueryExpressionParser expressionParser = new UriQueryExpressionParser(this.Settings.OrderByLimit); var orderByQueryTokens = expressionParser.ParseOrderBy(orderBy); // Bind it to metadata BindingState state = new BindingState(this.configuration); state.ImplicitRangeVariable = NodeFactory.CreateImplicitRangeVariable(elementType.ToTypeReference(), entitySet); state.RangeVariables.Push(state.ImplicitRangeVariable); MetadataBinder binder = new MetadataBinder(state); OrderByBinder orderByBinder = new OrderByBinder(binder.Bind); OrderByClause orderByClause = orderByBinder.BindOrderBy(state, orderByQueryTokens); return(orderByClause); }