【问题标题】:Modify odata results after query查询后修改odata结果
【发布时间】:2015-07-09 07:19:15
【问题描述】:

我有一个使用 Entity Framework 和 Odata 的 ASP.NET Web API 应用程序。

我想在使用 GET 时修改查询结果...目前,在控制器中,您实际上只需将 EntityFramework 数据实体传递回 Odata 处理程序...

[EnableQuery]
public IQueryable<myEntity> GetLineItem()
{
    return db.myEntities;
}

只需返回一个子集,就可以轻松地将 Odata 传递的任何查询添加到其中

return db.myEntity.Where(myEntity => myEntity.Name == "Bob")

Odata 会将 $filter 查询字符串参数中的任何内容添加到此处传递的表达式中,您将获得这些结果的子集。

但是,一旦查询执行并将 SQL 结果解析为实体对象,我想对结果进行迭代。

我已经尝试创建一个实现 IQueryable 接口并挂钩到 GetEnumerator 方法的包装器,对于 IProvider 和挂钩到执行方法也是如此。 Odata 似乎没有使用其中任何一种。

有没有办法做到这一点?

【问题讨论】:

    标签: asp.net-web-api odata


    【解决方案1】:

    以 Ihar 的 answer 为基础,这是一个应用查询选项然后修改结果集合的完整示例。

    public async Task<IHttpActionResult> Get(ODataQueryOptions<MyModel> options)
    {
        var query = _service.Query();
    
        var result = ((IQueryable<MyModel>)options.ApplyTo(query, new ODataQuerySettings()))
                                                  .ToArray();
    
        foreach (var model in result)
        {
            model.SomeNonQueriedValue = "Something else";
        }
    
        return Ok(result);
    }
    

    【讨论】:

      【解决方案2】:

      使用 OData 时,您不必从控制器返回 IQuerable。检查https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options 的“直接调用查询选项”部分 对于您的情况,它看起来像:

      public HttpResponseMessage Get(ODataQueryOptions<myEntity> opts)
      {
          var settings = new ODataValidationSettings();
      
          opts.Validate(settings);
      
          var intermediateResult = opts.ApplyTo(db.myEntities).ToArray();
      
          var result = //change intermediateResult as you wish.
      
          return result;
      }
      

      【讨论】:

        【解决方案3】:

        您可以通过实施过滤器来做到这一点。过滤器只是一个属性,您可以将其应用于操作(控制器的方法)、控制器(控制器的类)或注册整个应用程序。

        此过滤器应用于管道的某个步骤:有一个管道从传入的 HTTP 请求到控制器操作,然后返回响应,您可以在此管道的不同位置包含一个过滤器,以修改流经此管道的数据。

        您特别需要继承ActionFilterAttribute,并在控制器动作执行后执行的OnActionExecuted上进行后期处理。

        文档:

        最后一个类是OnActuonExecuted方法的参数类型,包含可以修改的响应。

        本文的第一部分包含对动作过滤器的解释: WEB API 2 USING ACTIONFILTERATTRIBUTE, OVERRIDEACTIONFILTERSATTRIBUTE AND IOC INJECTION

        【讨论】:

        • 谢谢!我什至不知道该去哪里找。
        猜你喜欢
        • 2014-08-09
        • 1970-01-01
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-10
        • 1970-01-01
        相关资源
        最近更新 更多