public void Validate_DoesntThrowIfTheLeafOfThePathIsWithinTheAllowedProperties() { // Arrange IEdmModel model = GetEdmModel(); IEdmEntityType edmType = model.SchemaElements.OfType <IEdmEntityType>().Single(t => t.Name == "LimitedEntity"); ODataQueryContext context = new ODataQueryContext(model, edmType); OrderByQueryOption option = new OrderByQueryOption("ComplexProperty/Value", context); ODataValidationSettings settings = new ODataValidationSettings(); settings.AllowedOrderByProperties.Add("Value"); // Act & Assert OrderByQueryValidator validator = OrderByQueryValidator.GetOrderByQueryValidator(context); ExceptionAssert.DoesNotThrow(() => validator.Validate(option, settings)); }
public void ValidateOrderByQueryValidator_ThrowsIfTryingToValidateALimitedProperty(string query, string edmTypeName, string message) { // Arrange IEdmModel model = GetEdmModel(); IEdmEntityType edmType = model.SchemaElements.OfType <IEdmEntityType>().Single(t => t.Name == edmTypeName); ODataQueryContext context = new ODataQueryContext(model, edmType); context.DefaultQuerySettings.EnableOrderBy = true; OrderByQueryOption option = new OrderByQueryOption(query, context); ODataValidationSettings settings = new ODataValidationSettings(); // Act & Assert OrderByQueryValidator validator = new OrderByQueryValidator(); ExceptionAssert.Throws <ODataException>(() => validator.Validate(option, settings), message); }
public void Validate_ThrowsIfTheLeafOfThePathIsntWithinTheAllowedProperties() { // Arrange IEdmModel model = GetEdmModel(); IEdmEntityType edmType = model.SchemaElements.OfType <IEdmEntityType>().Single(t => t.Name == "LimitedEntity"); ODataQueryContext context = new ODataQueryContext(model, edmType); OrderByQueryOption option = new OrderByQueryOption("ComplexProperty/Value", context); ODataValidationSettings settings = new ODataValidationSettings(); settings.AllowedOrderByProperties.Add("NotSortableProperty"); // Act & Assert OrderByQueryValidator validator = OrderByQueryValidator.GetOrderByQueryValidator(context); ExceptionAssert.Throws <ODataException>(() => validator.Validate(option, settings), "Order by 'Value' is not allowed. To allow it, set the 'AllowedOrderByProperties' property on EnableQueryAttribute or QueryValidationSettings."); }
/// <summary> /// Apply $orderby parameter to query. /// </summary> /// <param name="query"> /// The OData aware query. /// </param> /// <param name="orderbyText"> /// The $orderby parameter text. /// </param> /// <param name="entitySetName"> /// The entity set name. /// </param> /// <typeparam name="T"> /// The query type param /// </typeparam> /// <returns> /// The <see cref="ODataQuery{T}"/> query with applied order by parameter. /// </returns> /// <exception cref="ArgumentNullException"> /// Argument Null Exception /// </exception> public static ODataQueryOrdered <T> OrderBy <T>(this ODataQuery <T> query, string orderbyText, string entitySetName = null) { if (query == null) { throw new ArgumentNullException(nameof(query)); } if (orderbyText == null) { throw new ArgumentNullException(nameof(orderbyText)); } IEdmModel edmModel = query.EdmModel; ODataQueryOptionParser queryOptionParser = GetParser( query, entitySetName, new Dictionary <string, string> { { "$orderby", orderbyText } }); ODataSettings settings = query.ServiceProvider.GetRequiredService <ODataSettings>(); var orderByClause = queryOptionParser.ParseOrderBy(); orderByClause = TranslateParameterAlias(orderByClause, queryOptionParser); ICollection <OrderByNode> nodes = OrderByNode.CreateCollection(orderByClause); var validator = new OrderByQueryValidator(settings.DefaultQuerySettings); validator.Validate(nodes, settings.ValidationSettings, edmModel); IOrderedQueryable <T> result = (IOrderedQueryable <T>)OrderByBinder.OrderApplyToCore(query, settings.QuerySettings, nodes, edmModel); return(new ODataQueryOrdered <T>(result, query.ServiceProvider)); }