【问题标题】:Web API OData: How do you $expand on a single entity?Web API OData:你如何在单个实体上进行 $expand?
【发布时间】:2013-10-08 07:27:34
【问题描述】:

我已经多次阅读thesearticles 以尝试找出在单个实体上使用$expand 查询选项的方法,但是在我尝试过的每一种方式中,我都可以'似乎无法使它工作。所有其他查询选项都有效,$expand 目前也适用于收集结果。

模型:玩家实体有一个名为 Stats 的导航属性,其中每个对象都包含该玩家在给定年份的统计数据。

我是这样设置 OData 的:

config.EnableQuerySupport();

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Player>("OPlayer");
modelBuilder.EntitySet<PlayerStatistics>("OPlayerStats");

Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
config.Routes.MapODataRoute("ODataRoute", "odata", model);

最初,我是这样设置控制器的:

public class OPlayerController : EntitySetController<Player, int>
{
    private readonly DatabaseContext _db = new DatabaseContext();

    protected override Player GetEntityByKey(int key)
    {
        return _db.Players.FirstOrDefault(p => p.PlayerId == key);
    }

    public override IQueryable<Player> Get()
    {
        return _db.Players.AsQueryable();
    }

    protected override void Dispose(bool disposing)
    {
        _db.Dispose();
        base.Dispose(disposing);
    }
}

使用此配置,我可以进行以下查询:

  • /odata/OPlayer(600)
  • /odata/OPlayer
  • /odata/OPlayer?$expand=Stats

但显然不是(结果没有展开):

  • /odata/OPlayer(600)?$expand=Stats

两篇文章都提到,为了支持它,您必须向控制器添加一个方法(操作?),如下所示:

[Queryable]
public SingleResult<Player> GetPlayer(int id)
{
    return SingleResult.Create(_dbContext.Players.Where(c => c.ID == id);
}

不过,当我将它添加到我的控制器时,/odata/OPlayer(600)/odata/OPlayer(600)?$expand=Stats 都会返回 No action was found on the controller 'OPlayer' that matches the request.

任何人都可以提供说明或指点以支持单个实体上的$expand吗?

【问题讨论】:

  • 您使用的是什么版本的 Microsoft.Aspnet.WebApi.OData?
  • 好像是5.0.0-rc1

标签: c# asp.net-web-api odata


【解决方案1】:

您的操作GetPlayer 获取的参数名称不正确。参数名称应该是“key”而不是 id。尝试将此作为您的操作,

[Queryable]
public SingleResult<Player> GetPlayer([FromODataUri]int key)
{
    return SingleResult.Create(_db.Players.Where(c => c.PlayerId == key));
}

【讨论】:

  • 啊,我确实错过了以下article,它明确指出该参数必须称为key!感谢那。我仍然收到以下错误:The given model does not contain the type 'System.Web.Http.SingleResult[PolyPoolBasic.Models.Player].
  • 似乎这可能已在更新的版本中得到修复,我将尝试使用夜间构建
  • 确认!将 Web API 和 Web API OData 更新为 5.1.0-alpha1,一切正常!
  • 是的,我们在 RC 版本中回归了这一点。我们为 5.0.0 RTM 版本修复了它,不过它应该很快就会发布。
猜你喜欢
  • 1970-01-01
  • 2013-10-19
  • 2015-01-03
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 2020-08-23
相关资源
最近更新 更多