ODataController中的IQueryable GET操作/自定义导航属性

时间:2014-03-27 11:03:24

标签: .net odata asp.net-web-api-routing asp.net-web-api2

我正在开发一个实现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中注册假导航属性,以便生成路由?还是其他任何解决方案?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您不必创建虚假的导航属性。你需要做的是:

  1. 添加复杂类型:

    oDataConventionModelBuilder.ComplexType<Entry>();
    
  2. 在广告资源中添加属性:

    public class Inventory
    {
        public IList<Entry> Entries { get; set; }
        // Other properties.
    }
    
  3. 在EDM模型中的实体类型库存中添加属性。
  4. 那就是它。

    请注意,如果您的控制器名称是InventoriesController,则需要访问此URL中的条目&#39; / odata / Inventoryories(1)/ Entries&#39;而不是&#39; / odata / Inventory(1)/ Entries&#39;