2014-03-27 34 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