// new, ok private Microsoft.OData.UriParser.ODataQueryOptionParser CreateParser( Type rootType, Type entityType, string filter = null, string orderby = null, string selectExpand = null) { var edmType = _model.FindDeclaredType(rootType.FullName); var clauses = new Dictionary <string, string>() { { "$filter", filter }, { "$orderby", orderby }, { "$select", null }, { "$expand", selectExpand }, }; var parser = new Microsoft.OData.UriParser.ODataQueryOptionParser(_model, edmType, null, clauses, _serviceProvider) { Resolver = new Microsoft.OData.UriParser.StringAsEnumResolver() { EnableCaseInsensitive = true, }, Settings = { MaximumExpansionDepth = 1, }, }; return(parser); }
// new ok private Expression ApplyOptions(IQueryable queryable, ODataQueryContext queryContext, Microsoft.OData.UriParser.ODataQueryOptionParser queryOptionParser, string filter, string orderby, string selectExpand) { var filterQueryOption = filter == null ? null : new FilterQueryOption(filter, queryContext, queryOptionParser); var orderQueryOption = orderby == null ? null : new OrderByQueryOption(orderby, queryContext, queryOptionParser); var selectExpandQueryOption = selectExpand == null ? null : new SelectExpandQueryOption(null, selectExpand, queryContext, queryOptionParser); var querySettings = new ODataQuerySettings() { HandleNullPropagation = this.HandleNullPropagation ? HandleNullPropagationOption.True : HandleNullPropagationOption.False, }; var validationSettings = new ODataValidationSettings() { MaxNodeCount = 100 }; try { filterQueryOption?.Validate(validationSettings); orderQueryOption?.Validate(validationSettings); selectExpandQueryOption?.Validate(validationSettings); } catch (Exception) { throw; } IQueryable result = queryable; if (filterQueryOption != null) { result = filterQueryOption?.ApplyTo(result, querySettings); } if (orderQueryOption != null) { result = orderQueryOption?.ApplyTo(result, querySettings); } if (selectExpandQueryOption != null) { result = selectExpandQueryOption?.ApplyTo(result, querySettings); } var expression = result.Expression; if (EvaluateLocals) { expression = CapturedEvaluator.CapturedEvaluator.Eval(expression); } return(expression); }