protected ODataQueryOptions <T> GetOdataQueryOptions <T>(ControllerBase controller, string uriString = "http://localhost:9000/api/any?$top=5") where T : class { var provider = GetServiceProvider(); var routeBuilder = new RouteBuilder(Mock.Of <IApplicationBuilder>(x => x.ApplicationServices == provider)); routeBuilder.EnableDependencyInjection(); var modelBuilder = new ODataConventionModelBuilder(provider); modelBuilder.EntitySet <T>(typeof(T).Name); var model = modelBuilder.GetEdmModel(); var uri = new Uri(uriString); var httpContext = GetHttpContext(provider); HttpRequest req = new DefaultHttpRequest(httpContext) { Method = "GET", Host = new HostString(uri.Host, uri.Port), Path = uri.LocalPath, QueryString = new QueryString(uri.Query) }; var context = new ODataQueryContext(model, typeof(T), new Microsoft.AspNet.OData.Routing.ODataPath()); return(new ODataQueryOptions <T>(context, req)); }
public static IQueryable ApplyTo <TEntity>(this HttpRequest request, IQueryable <TEntity> query) where TEntity : class { // Parte 1 - Se registran los componentes requeridos por la implementación de // Microsoft ASP.NET Core OData y se memorizan en una variable estática if (_provider == null) { var collection = new ServiceCollection(); collection.AddMvcCore(options => { options.EnableEndpointRouting = false; }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1); collection.AddOData(); collection.AddTransient <ODataUriResolver>(); collection.AddTransient <ODataQueryValidator>(); collection.AddTransient <TopQueryValidator>(); collection.AddTransient <FilterQueryValidator>(); collection.AddTransient <SkipQueryValidator>(); collection.AddTransient <OrderByQueryValidator>(); _provider = collection.BuildServiceProvider(); } // Parte 2 - Se configura la ruta de ASP.NET Core OData if (_routeBuilder == null) { _routeBuilder = new RouteBuilder(new ApplicationBuilder(_provider)); _routeBuilder.EnableDependencyInjection(); } // Parte 3 - Se simula un pedido HTTP como si viniese desde ASP.NET Core var modelBuilder = new ODataConventionModelBuilder(_provider); modelBuilder.AddEntityType(typeof(TEntity)); var edmModel = modelBuilder.GetEdmModel(); var httpContext = new DefaultHttpContext { RequestServices = _provider }; HttpRequest req = new DefaultHttpRequest(httpContext) { Method = "GET", Host = request.Host, Path = request.Path, QueryString = request.QueryString }; var oDataQueryContext = new ODataQueryContext(edmModel, typeof(TEntity), new Microsoft.AspNet.OData.Routing.ODataPath()); var odataQuery = new ODataQueryOptions <TEntity>(oDataQueryContext, req); // Parte 4 - Se aplica la consulta OData al queryable que nos pasan por parámetro return(odataQuery.ApplyTo(query.AsQueryable())); }
public static IQueryable ApplyTo <TEntity>(this HttpRequest request, IQueryable <TEntity> query) where TEntity : class { // Part 1 - The components required by the implementation of // Microsoft ASP.NET Core OData and are stored in a static variable if (_provider == null) { var collection = new ServiceCollection(); collection.AddMvc().AddNewtonsoftJson(); collection.AddLogging(); collection.AddOData(); collection.AddTransient <ODataUriResolver>(); collection.AddTransient <ODataQueryValidator>(); collection.AddTransient <TopQueryValidator>(); collection.AddTransient <FilterQueryValidator>(); collection.AddTransient <SkipQueryValidator>(); collection.AddTransient <OrderByQueryValidator>(); _provider = collection.BuildServiceProvider(); } // Part 2 - ASP.NET Core OData path is configured if (_routeBuilder == null) { _routeBuilder = new RouteBuilder(new ApplicationBuilder(_provider)); _routeBuilder.EnableDependencyInjection(); } // Part 3 - An HTTP request is simulated as if it came from ASP.NET Core var modelBuilder = new ODataConventionModelBuilder(_provider); modelBuilder.AddEntityType(typeof(TEntity)); var edmModel = modelBuilder.GetEdmModel(); var httpContext = request.HttpContext; httpContext.RequestServices = _provider; HttpRequest req = request; req.Method = "GET"; req.Host = request.Host; req.Path = request.Path; req.QueryString = request.QueryString; req.HttpContext.RequestServices = _provider; var oDataQueryContext = new ODataQueryContext(edmModel, typeof(TEntity), new Microsoft.AspNet.OData.Routing.ODataPath()); var odataQuery = new ODataQueryOptions <TEntity>(oDataQueryContext, req); // Part 4 - The OData query is applied to the queryable that is passed to us by parameter return(odataQuery.ApplyTo(query.AsQueryable())); }
public static void ClassInitialize(TestContext testContext) { var builder = new ODataConventionModelBuilder(); var type = typeof(MockOpenType); var entityTypeConfiguration = builder.AddEntityType(type); entityTypeConfiguration.HasKey(type.GetProperty("Id")); builder.AddEntitySet(type.Name, entityTypeConfiguration); var conf = builder.EntitySet <MockOpenType>(type.Name); conf.EntityType.Property(p => p.Id).Name = "id"; var edmModels = builder.GetEdmModel(); ODataQueryContext = new ODataQueryContext(edmModels, type, new ODataPath()); var collection = new ServiceCollection(); #if NET6_0 collection .AddControllers() .AddOData(); #else collection.AddOData(); #endif collection.AddODataQueryFilter(); collection.AddTransient <ODataUriResolver>(); collection.AddTransient <ODataQueryValidator>(); collection.AddTransient <TopQueryValidator>(); collection.AddTransient <FilterQueryValidator>(); collection.AddTransient <SkipQueryValidator>(); collection.AddTransient <OrderByQueryValidator>(); #if NET6_0 collection.AddTransient <ILoggerFactory, TestLoggingFactory>(); #endif Provider = collection.BuildServiceProvider(); var applicationBuilder = Substitute.For <IApplicationBuilder>(); applicationBuilder.ApplicationServices.Returns(Provider); #if !NET6_0 var routeBuilder = new RouteBuilder(applicationBuilder); routeBuilder.EnableDependencyInjection(); #endif }
protected void BeforeEachBenchmark(int recordCount) { var collection = new ServiceCollection(); collection.AddOData(); collection.AddODataQueryFilter(); _provider = collection.BuildServiceProvider(); var routeBuilder = new RouteBuilder(Mock.Of <IApplicationBuilder>(x => x.ApplicationServices == _provider)); routeBuilder.EnableDependencyInjection(); _oDataRequestHelper = new ODataRequestHelper(); _edmEntityTypeSettings = GetEdmEntityTypeSettings(); _httpContext = new DefaultHttpContext(); _genericEntityRepository = new GenericEntityRepository(recordCount); _oDataRequestHelper.GetEdmModel(_httpContext.Request, _edmEntityTypeSettings, EdmNamespaceName); }
public ODataContext(Func <IEnumerable <ConfigureODataConventionModelBuilder> > conventions) { var services = new ServiceCollection(); services.AddMvcCore(); services.AddOData(); services.AddTransient <ODataUriResolver>(); services.AddTransient <ODataQueryValidator>(); services.AddTransient <TopQueryValidator>(); services.AddTransient <FilterQueryValidator>(); services.AddTransient <SkipQueryValidator>(); services.AddTransient <OrderByQueryValidator>(); services.AddTransient <CountQueryValidator>(); services.AddTransient <SelectExpandQueryValidator>(); services.AddTransient <SkipTokenQueryValidator>(); Services = services.BuildServiceProvider(); var routeBuilder = new RouteBuilder(new ApplicationBuilder(Services)); routeBuilder .Count() .Expand() .Filter() .MaxTop(null) .OrderBy() .Select() .SkipToken(); routeBuilder.EnableDependencyInjection(); _model = new Lazy <IEdmModel>(() => { var builder = new ODataConventionModelBuilder(Services); foreach (var convention in conventions()) { convention.Configure(builder); } return(builder.GetEdmModel()); }); }
public static ServiceProvider GetServiceProvider() { var collection = new ServiceCollection(); collection.AddOData(); collection.AddODataQueryFilter(); collection.AddTransient <ODataUriResolver>(); collection.AddTransient <ODataQueryValidator>(); collection.AddTransient <TopQueryValidator>(); collection.AddTransient <FilterQueryValidator>(); collection.AddTransient <SkipQueryValidator>(); collection.AddTransient <OrderByQueryValidator>(); var provider = collection.BuildServiceProvider(); var routeBuilder = new RouteBuilder(Mock.Of <IApplicationBuilder>(x => x.ApplicationServices == provider)); routeBuilder.EnableDependencyInjection(); return(provider); }