c# – ASP.NET MVC Web API并传递oData查询
发布时间:2020-12-15 21:55:07 所属栏目:百科 来源:网络整理
导读:我目前正在使用oData过滤器请求执行Web API,如下所示: public IQueryableOrganizationViewModel Get(ODataQueryOptionsOrganization oDataQuery){ var query = new FindOrganizationsQuery(oDataQuery); var result =_findOrganizationsQueryHandler.Execut
我目前正在使用oData过滤器请求执行Web API,如下所示:
public IQueryable<OrganizationViewModel> Get(ODataQueryOptions<Organization> oDataQuery) { var query = new FindOrganizationsQuery(oDataQuery); var result =_findOrganizationsQueryHandler.Execute(query); return result.Organizations.Select(o => new OrganizationViewModel { Id = o.PublicId,Name = o.Name }); } 处理程序看起来像: public FindOrganizationsQueryResult Execute(FindOrganizationsQuery request) { var organizations = request.ODataQuery.ApplyTo(_mgpQueryContext.Organizations).Cast<Organization>(); return new FindOrganizationsQueryResult(organizations); } 查询类看起来像: public class FindOrganizationsQuery { public FindOrganizationsQuery(ODataQueryOptions<Organization> oDataQuery) { ODataQuery = oDataQuery; } public ODataQueryOptions<Organization> ODataQuery { get; set; } } 因此,如果我通过请求传递oData过滤器,它处理得很好,这一切都正常. 但是现在,我不想将类型ODataQueryOptions传递给Get操作,而是希望有FindOrganizationsQuery类,如: public IQueryable<OrganizationViewModel> FindOrganizations(FindOrganizationsQuery query) { // query is null } 但是,查询参数始终为null.如果ODataQueryOptions参数在另一个类中,我如何传递oData过滤器? 解决方法
您可以为我们为ODataQueryOptions执行的
same way的FindOrganizationsQuery编写自定义参数绑定属性,然后使用该属性对FindOrganizationsQuery进行属性.
下面是一些示例代码, public class CustomQueryBindingAttribute : ParameterBindingAttribute { public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter) { return new CustomQueryBinding(parameter); } internal class CustomQueryBinding : HttpParameterBinding { public CustomQueryBinding(HttpParameterDescriptor parameter) : base(parameter) { } internal class CustomQueryBinding : HttpParameterBinding { public CustomQueryBinding(HttpParameterDescriptor parameter) : base(parameter) { } public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider,HttpActionContext actionContext,CancellationToken cancellationToken) { IEdmModel model = actionContext.Request.GetEdmModel() ?? actionContext.ActionDescriptor.GetEdmModel(typeof(Organization)); ODataQueryContext queryContext = new ODataQueryContext(model,typeof(Organization)); object customQuery = CreateCustomQuery(queryContext,actionContext.Request); SetValue(actionContext,customQuery); return Task.FromResult(0); } private object CreateCustomQuery(ODataQueryContext queryContext,HttpRequestMessage request) { Type parameterType = Descriptor.ParameterType; // Assuming all custom queries have this public property. Type oDataQueryOptionsOfTType = parameterType.GetProperty("ODataQuery").PropertyType; object odataQueryOptions = Activator.CreateInstance(oDataQueryOptionsOfTType,queryContext,request); return Activator.CreateInstance(parameterType,odataQueryOptions); } } } 我从web API源代码复制的扩展方法因为它不公开. public static class HttpActionDescriptorExtensions { internal const string EdmModelKey = "MS_EdmModel"; internal static IEdmModel GetEdmModel(this HttpActionDescriptor actionDescriptor,Type entityClrType) { // save the EdmModel to the action descriptor return actionDescriptor.Properties.GetOrAdd(EdmModelKey + entityClrType.FullName,_ => { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(actionDescriptor.Configuration,isQueryCompositionMode: true); EntityTypeConfiguration entityTypeConfiguration = builder.AddEntity(entityClrType); builder.AddEntitySet(entityClrType.Name,entityTypeConfiguration); IEdmModel edmModel = builder.GetEdmModel(); return edmModel; }) as IEdmModel; } } 我有完整的样品here. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |