【问题标题】:OData web api - upgrade to AsyncEntitySetController - Get methodOData web api - 升级到 AsyncEntitySetController - Get 方法
【发布时间】:2018-10-25 02:12:32
【问题描述】:

我们有使用 OData 的 WEB API。我们的控制器继承自EntitySetController,现在我们将其更改为AsyncEntitySetController

Patch、Post、Put、Get(key) 方法很容易更改,但问题在于 Get 方法。

在EntitySetController中返回IQueryable,URI中指定的过滤器被进一步应用,然后查询被执行。

但在 AsyncEntitySetController 中,它返回 IEnumerable,因此我们需要在方法中调用 ToListAsync,我担心在应用过滤器并将过滤器应用于内存集合之前未应用来自 URI 的参数或调用查询。

如何实现它的行为方式与 EntitySetController 相同,所以:

  • 可查询
  • 应用来自 URI 的过滤器
  • 查询是以异步/等待方式调用的?

【问题讨论】:

  • 你能解决这个问题吗?我们面临同样的问题
  • @NahuelPrieto:看起来像我一样。我需要真实地证明它(不幸的是,我太忙了,无法回到它),但似乎使用 QueryOptions.ApplyTo(query) where 'query' 是你的 IQueryable 你需要从中获取结果,而 'QueryOptions' 是出现在控制器实例上将应用来自 URI 的查询参数。这是关键部分,休息应该很顺利。

标签: asp.net entity-framework async-await odata


【解决方案1】:

我设法通过使用QueryOptions.ApplyTo(query) 解决了这个问题。所以我之前在控制器类中的代码派生自EntitySetController

public override IQueryable<Entity> Get()
{
    return this.DataContext.Entities;
}

被转化为从AsyncEntitySetController派生的控制器类,像这样:

public override Task<IEnumerable<Entity>> Get()
{
    var query = this.DataContext.Entities;

    query = (IQueryable<Entity>)this.QueryOptions.ApplyTo(query);
    return query.ToListAsync();
}

需要注意的一点。从 URI 中的查询参数中跳过被应用了两次,请参阅:WebAPI OData $Skip on custom IQueryable double applied

您可以像这样实现自己的 EnableQuery 属性,并在控制器中使用该属性装饰 Get 方法:

public sealed class EnableQueryIgnoreSkipAttribute : EnableQueryAttribute
{
    public override IQueryable ApplyQuery(IQueryable queryable, ODataQueryOptions queryOptions)
    {
        // Do not apply Skip
        var skipOption = new SkipQueryOption("0", queryOptions.Context);
        typeof(ODataQueryOptions).GetProperty(nameof(ODataQueryOptions.Skip)).SetValue(queryOptions, skipOption, null);

        return base.ApplyQuery(queryable, queryOptions);
    }
}

然后像这样装饰方法:

[EnableQueryIgnoreSkip]
public override Task<IEnumerable<Entity>> Get()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2014-06-06
    相关资源
    最近更新 更多