Web API OData:您如何在单个实体上进行扩展?
我已经多次阅读这 两篇文章 ,试图找出在单个实体上使用$expand
查询选项的方法,但是在我尝试过的每一种方式中,我似乎都无法做到这行得通。 所有其他查询选项都有效, $expand
目前也适用于收集结果。
模型 :玩家实体具有名为Stats的导航属性,其中每个对象包含给定年份的该玩家的统计数据。
我用这种方式设置了OData:
config.EnableQuerySupport(); ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet("OPlayer"); modelBuilder.EntitySet("OPlayerStats"); Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel(); config.Routes.MapODataRoute("ODataRoute", "odata", model);
最初,我以这种方式设置了我的控制器:
public class OPlayerController : EntitySetController { private readonly DatabaseContext _db = new DatabaseContext(); protected override Player GetEntityByKey(int key) { return _db.Players.FirstOrDefault(p => p.PlayerId == key); } public override IQueryable 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 GetPlayer(int id) { return SingleResult.Create(_dbContext.Players.Where(c => c.ID == id); }
当我将它添加到我的控制器时, /odata/OPlayer(600)
和/odata/OPlayer(600)?$expand=Stats
return No action was found on the controller 'OPlayer' that matches the request.
任何人都可以提供澄清,或指示以支持单个实体的$expand
吗?
您的操作GetPlayer
使参数名称不正确。 参数名称应为“key”而不是id。 试试这个作为你的行动,
[Queryable] public SingleResult GetPlayer([FromODataUri]int key) { return SingleResult.Create(_db.Players.Where(c => c.PlayerId == key)); }