2014-03-27 31 views
1

我正在开发一个实现ASP.NET Web API OData控制器的项目。 我试图在实体上创建一个自定义的可查询的GET操作,但是经过大量的搜索之后,我还没有找到这样做的简单方法。ODataController中的IQueryable GET操作/自定义导航属性

我有一个具有Snapshot属性的库存模型,并具有一个Entries集合(inventory.Snapshot.Entries)。 逻辑关系是:库存使用快照,快照包含条目。根据库存的其他属性,只有部分快照条目与库存相关。 最重要的是,清单可能没有定义特定的快照,在这种情况下,其快照属性为空,并且必须寻找合适的快照。

这么说,我想下面的网址是有效的,尽管库存不具有项属性:

/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

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

  1. 添加一个复杂类型:

    oDataConventionModelBuilder.ComplexType<Entry>(); 
    
  2. 在库存中添加一个属性:

    public class Inventory 
    { 
        public IList<Entry> Entries { get; set; } 
        // Other properties. 
    } 
    
  3. 添加在实体类型清单中的财产EDM模型。

就是这样。

注意,如果你的控制器名称为InventoriesController,你需要访问这个URL '/的OData /存货(1)/参赛作品',而不是输入 '/的OData /存货(1)/参赛作品'

+0

我固定在网址中输入错字。 它看起来像我真正想要的是在OData 4.0 Web API 2.2中使用的OData函数。 与此同时,似乎最简单的解决方案是将集合添加到模型中,即使它们仅用于生成控制器方法的路由。 谢谢! – Antoine