Gab*_*Roy 5 c# odata asp.net-web-api
我已多次阅读这 两篇文章,试图找出$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);
Run Code Online (Sandbox Code Playgroud)
最初,我以这种方式设置了我的控制器:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
使用此配置,我可以进行以下查询:
/odata/OPlayer(600)/odata/OPlayer/odata/OPlayer?$expand=Stats但显然不是(结果没有扩大):
/odata/OPlayer(600)?$expand=Stats这两篇文章都提到为了支持它,你必须向你的控制器添加一个方法(action?),如下所示:
[Queryable]
public SingleResult<Player> GetPlayer(int id)
{
return SingleResult.Create(_dbContext.Players.Where(c => c.ID == id);
}
Run Code Online (Sandbox Code Playgroud)
当我加入这个我控制器不过,无论是/odata/OPlayer(600)和/odata/OPlayer(600)?$expand=Stats回报No action was found on the controller 'OPlayer' that matches the request.
任何人都可以提供澄清,或指点以支持$expand单个实体吗?
您的操作GetPlayer导致参数名称不正确.参数名称应为"key"而不是id.试试这个作为你的行动,
[Queryable]
public SingleResult<Player> GetPlayer([FromODataUri]int key)
{
return SingleResult.Create(_db.Players.Where(c => c.PlayerId == key));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5071 次 |
| 最近记录: |