加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-web-api – 修改WebAPI OData QueryOptions.Filter的最

发布时间:2020-12-16 03:55:47 所属栏目:asp.Net 来源:网络整理
导读:我在 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 : EntitySetControllerP
我在 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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读