我目前正在使用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 }
解决方法
您可以为我们为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); } } }
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; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。