【问题标题】:oData $expand on Derived TypesoData $expand 派生类型
【发布时间】:2016-10-18 23:37:52
【问题描述】:

我在获取派生类型的 odata 查询方面遇到了挑战:

{{Url}}/odata/resource?$expand=derivedType

看到这个link,它提供了类似的选项 ~/People/OfType('Employee')(41)/Manager 或 ~/People!Employee 不起作用。

带有 EF6 的 Asp.Net Web Api 2 是否支持此功能?查询是什么?

【问题讨论】:

    标签: entity-framework asp.net-web-api odata


    【解决方案1】:

    这是 OData 4.0 约定文档的摘录:

    标识集合的任何资源路径或路径表达式 实体或复杂类型实例可以附加路径段 包含从声明的类型派生的类型的限定名称 的集合。结果将仅限于 派生类型,可能为空。任何资源路径或路径表达式 可以附加标识单个实体或复杂类型实例 具有包含派生类型的限定名称的路径段 来自已识别资源的声明类型。如果在一个 资源路径和标识的资源不是 派生类型,请求将导致 404 Not Found 响应。如果 在作为布尔表达式一部分的路径表达式中使用时, 类型转换将评估为 null。示例 30:实体集限制为 VipCustomer 实例

    http://host/service/Customers/Model.VipCustomer
    示例 31:实体 仅限于 VipCustomer 实例,如果出现 404 Not Found 键为 1 的客户不是 VipCustomer

    http://host/service/Customers/Model.VipCustomer(1) http://host/service/Customers(1)/Model.VipCustomer
    示例 32:演员表 复杂属性 Address 到它的派生类型DetailedAddress,然后 获取派生类型的属性

    http://host/service/Customers(1)/Address/Model.DetailedAddress/Location
    示例 33:类型转换的过滤器表达式;将评估为 null 对于所有非 VipCustomer 实例,因此仅返回 贵宾客户

    http://host/service/Customers?$filter=Model.VipCustomer/PercentageOfVipPromotionProductsOrdered gt 80
    示例 34:仅展开单个相关客户,如果它是 Model.VipCustomer 的实例。仅适用于对多关系 Model.VipCustomer 实例将被内联,

    http://host/service/Orders?$expand=Customer/Model.VipCustomer

    【讨论】:

      【解决方案2】:

      该博文中的信息已过时。官方 OData 规范可在http://www.odata.org/documentation/ 获得。

      在 OData v4 中,您可以通过将派生类型的完全限定名称附加到资源 URI 路径来filter by derived type。例如,GET http://host/Employees/MyService.Manager 将检索同时也是经理的员工子集(假设经理派生自员工类型)。最后一个路径段中的前缀MyService 是定义Manager 类型的OData 命名空间。

      您还可以在expanding a navigation property 时按派生类型过滤,方法是将派生类型的完全限定名称附加到$expand 子句中的属性名称。例如,GET http://host/Companies('Acme')?$expand=Employees/MyService.Manager 将检索名为 Acme 的公司,其中所有经理都内联展开。

      【讨论】:

      • 试过 $expand=resource/namespace.resourceDerivedType。我收到 400 个错误请求。 { "error": { "code": "", "message": "找到了一个遍历多个导航属性的路径。请改写查询,使每个展开路径只包含类型段和导航属性。" } }
      • 我已经回答了您关于使用派生类型的查询格式的问题。如果您有特定问题,请使用代码示例发布另一个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-15
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多