Web API OData:您如何在单个实体上进行扩展?

时间:2013-10-02 00:07:14

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

我已多次阅读these articles两次尝试找出在单个实体上使用$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吗?

1 个答案:

答案 0 :(得分:5)

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

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