【问题标题】:IQueryable GET action / custom navigation property in ODataControllerODataController 中的 IQueryable GET 操作/自定义导航属性
【发布时间】:2014-03-27 11:03:23
【问题描述】:

我正在开发一个实现 ASP.NET Web API OData 控制器的项目。 我正在尝试在实体上创建自定义可查询 GET 操作,但是经过广泛搜索后,我还没有找到一种直接的方法。

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

也就是说,我希望以下 URL 有效,即使 Inventory 没有 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 中注册虚假导航属性以便生成路由?还是有其他解决方案?

感谢您的帮助

【问题讨论】:

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


    【解决方案1】:

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

    1. 添加复杂类型:

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

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

    就是这样。

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

    【讨论】:

    • 我修正了 URL 中的错字。看起来我真正想要的是 OData 函数,这些函数将在 OData 4.0 的 Web API 2.2 中出现。与此同时,似乎最简单的解决方案是将集合添加到模型中,即使它们仅用于生成到控制器方法的路由。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    相关资源
    最近更新 更多