.NET ODataController 类,用于返回与控制器的类型无关的类型集合

本文关键字:类型 集合 控制器 ODataController 用于 返回 NET | 更新日期: 2023-09-27 18:32:11

我有一个类,MyClassController继承自ODataController。我已经能够使用"自动魔术"路由来访问缩放器集合类型的属性,例如,/path/to/MyClass(100)/SomeProperty .我现在需要返回一个在结构上与MyClass无关的类的集合(即,没有连接这两个类的引用),但从逻辑上讲,两者之间存在关系。我希望能够做一些像GET /path/to/MyClass(100)/RelatedThings/这样的事情。如何设置?我正在使用Application_Start中的ODataConventionModelBuilder.EntitySet<>设置MyClass及其相关类。

我正在使用Microsoft.OData.Core 6.13.0(OData 4.0)。

编辑:我从这个问题中省略了一些细节,我没有意识到这些细节与我在应用程序其他地方所做的一些设计决策有关,所以我接受了最能解决这个问题的答案,而不考虑这些细节。我最终在 MyClass 控制器中创建了一个绑定的 OData 函数,该函数返回了相关内容。我发现如果我不包含命名空间或尾部斜杠,HTTP 请求会产生错误。也就是说,/path/to/MyClass(100)/Default.RelatingThings/有效。我正在寻找消除尾部斜杠和命名空间需求的方法。(编辑:设置 OData 路由时调用config.EnableUnqualifiedNameCall(true);请参阅 https://stackoverflow.com/a/35156885/1102726。

.NET ODataController 类,用于返回与控制器的类型无关的类型集合

OData 路由不必与存储架构中的关系匹配;即,缺少结构关系是无关紧要的。只需添加一个类似于以下内容的属性MyClass

public ICollection<Thing> RelatedThings { get; set; }

然后为属性定义操作方法:

public IQueryable<Thing> GetRelatedThings([FromODataUri] int key)
{
    // Fill-in data access logic.
}

您不会请求/path/to/MyClass(100)?$expand=RelatedThings,但您可以根据需要请求/path/to/MyClass(100)/RelatedThings

由于数据在结构上不相关,因此无法扩展到相关实体。 有一个用于数据聚合的 oData 扩展,连接

使用扩展名,它看起来像这样:

~/$crossjoin(Products,Sales)
                     ?$expand=Products($select=Name),Sales($select=Amount)
                     &$filter=Products/ID eq Sales/ProductID

您可以在 OData 中看到交叉联接的完整示例