我正在开发一个实现ASP.NET Web API OData控制器的项目。 我正在尝试在实体上创建自定义可查询GET操作,但是经过大量搜索后,我还没有找到一种直接的方法。
我有一个带有Snapshot属性的Inventory模型,该属性又有一个Entries集合(inventory.Snapshot.Entries)。 逻辑关系为:inventory 使用快照,snapshot 包含条目。根据库存的其他属性,只有快照的某些条目与库存相关。 最重要的是,清单可能没有定义特定的快照,在这种情况下,其Snapshot属性为null,并且必须寻找合适的快照。
即使库存没有Entries属性,我希望以下URL有效:
/odata/Inventories(1)/Entries
在InventoriesController下:
public async Task<IQueryable<Entry>> GetEntries([FromODataUri] int key)
{
var inventory = await db.Inventories.FindAsync(key);
if (inventory.SnapshotId != null)
{
return QueryRelatedEntriesInSnapshot(inventory, inventory.SnapshotId);
}
else
{
return QueryRelatedEntriesInSnapshot(inventory, await GetBestSnapshot(inventory, db.Snapshots));
}
}
这是否需要自定义路由约定,还是可以在ODataConventionModelBuilder中注册假导航属性,以便生成路由?还是其他任何解决方案?
感谢您的帮助
答案 0 :(得分:0)
您不必创建虚假的导航属性。你需要做的是:
添加复杂类型:
oDataConventionModelBuilder.ComplexType<Entry>();
在广告资源中添加属性:
public class Inventory
{
public IList<Entry> Entries { get; set; }
// Other properties.
}
那就是它。
请注意,如果您的控制器名称是InventoriesController,则需要访问此URL中的条目&#39; / odata / Inventoryories(1)/ Entries&#39;而不是&#39; / odata / Inventory(1)/ Entries&#39;