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

时间:2016-01-27 14:59:40

标签: c# asp.net odata

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

我正在使用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

2 个答案:

答案 0 :(得分:2)

您的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

答案 1 :(得分:1)

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

使用扩展名它看起来像:

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

您可以看到Cross Joining in OData

的完整示例