asp.net-web-api – 修改WebAPI OData QueryOptions.Filter的最
我在
http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/working-with-entity-relations使用OData示例项目.在Get我希望能够更改EntitySetController的QueryOptions中的Filter:
public class ProductsController : EntitySetController<Product,int> { ProductsContext _context = new ProductsContext(); [Queryable(AllowedQueryOptions=AllowedQueryOptions.All)] public override IQueryable<Product> Get() { var products = QueryOptions.ApplyTo(_context.Products).Cast<Product>(); return products.AsQueryable(); } 我希望能够找到专门提到的属性.我可以通过解析this.QueryOptions.Filter.RawValue来获取属性名称但我无法更新RawValue,因为它是只读的.但是,我可以从修改后的RawValue创建另一个FilterQueryOption实例,但我无法将其分配给this.QueryOptions.Filter,因为这也是只读的. 我想我可以调用新过滤器的ApplyTo传递它_context.Products,但是我需要单独调用QueryOptions的其他属性的ApplyTo,如Skip和OrderBy.有没有比这更好的解决方案? 更新 我尝试了以下方法: public override IQueryable<Product> Get() { IQueryable<Product> encryptedProducts = _context.Products; var filter = QueryOptions.Filter; if (filter != null && filter.RawValue.Contains("Name")) { var settings = new ODataQuerySettings(); var originalFilter = filter.RawValue; var newFilter = ParseAndEncyptValue(originalFilter); filter = new FilterQueryOption(newFilter,QueryOptions.Context); encryptedProducts = filter.ApplyTo(encryptedProducts,settings).Cast<Product>(); if (QueryOptions.OrderBy != null) { QueryOptions.OrderBy.ApplyTo<Product>(encryptedProducts); } } else { encryptedProducts = QueryOptions.ApplyTo(encryptedProducts).Cast<Product>(); } var unencryptedProducts = encryptedProducts.Decrypt().ToList(); return unencryptedProducts.AsQueryable(); } 它似乎正在努力到一定程度.如果我设置断点,我可以在未加密的产品列表中看到我的产品,但是当方法返回时,我没有得到任何项目.我尝试重新启动[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)],但它没有任何效果.任何想法为什么我没有得到物品? 更新2 我发现即使我没有使用Queryable属性,我的查询也被应用了两次.这意味着即使我有要返回的项目,也会使用未加密的值查询List,因此没有返回任何值. 我尝试使用ODataController代替: public class ODriversController : ODataController { //[Authorize()] //[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)] public IQueryable<Products> Get(ODataQueryOptions options) { 这工作了!这是否表明EntitySetController中存在错误? 解决方法
您可能需要重新生成ODataQueryOptions来解决您的问题.假设您要修改以添加$orderby,您可以这样做:
string url = HttpContext.Current.Request.Url.AbsoluteUri; url += "&$orderby=name"; var request = new HttpRequestMessage(HttpMethod.Get,url); ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet<Product>("Product"); var options = new ODataQueryOptions<Product>(new ODataQueryContext(modelBuilder.GetEdmModel(),typeof(Product)),request); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- ASP.NET,C#和匿名类型 – 在手动构建匿名类型时迭代DataTab
- asp.net-mvc – 实体框架删除记录
- asp.net – 在Sitecore中检索URL路径部分的方法是什么?
- asp.net-core – 构建asp.net核心错误
- asp.net – 用户定义的CSS /样式
- asp.net-mvc – 在ASP.NET MVC中创建报表的最佳方式
- asp.net-mvc-3 – MVC3 – 使用Entity框架设置Controller时
- asp.net – 安装Ninject.MVC5后的FileLoadException
- asp.net-mvc – 如何在共享托管环境中实现ASP.Net MVC网站的
- asp.net使用DataTable构造Json字符串的方法
- asp.net – 为什么IFormFile显示为null,我该如何
- 动手造轮子:实现一个简单的依赖注入(一)
- asp.net – 在不使用HttpRequest的情况下获取主机
- asp.net-mvc-4 – 使用Durandal的会话数据
- ASP.NET Core应用的错误处理[4]:StatusCodePage
- asp.net-mvc – 以编程方式获取MVC视图列表?
- [你必须知道的.NET] 第五回:深入浅出关键字---把
- asp.net – Web应用程序中的自动填充,我应该在哪
- asp.net-mvc – 将焦点放在不使用JavaScript的Ed
- asp.net-mvc-3 – 安全地通过ASP.NET同步上下文执