odata - 结合 $expand 和 $select

Posted

技术标签:

【中文标题】odata - 结合 $expand 和 $select【英文标题】:odata - combining $expand and $select 【发布时间】:2015-04-04 07:04:48 【问题描述】:

在 odata v4.0 中是否有将 $expand 和 $select 组合在一起的选项?

我有一个场景,我试图在其中获取特定列 productItemChoices 和项目。以下查询将为您提供所有 productItemChoices 中的列。我只需要一列 productItemChoices

odata/Products(08f80b45-68a9-4a9f-a516-556e69e6bd58)?$expand=productItemChoices($expand=item($select=name))

【问题讨论】:

【参考方案1】:

在这方面经历了很多时间之后,我终于得到了答案。我们可以将select 嵌套在expand 中,使用; 作为分隔符,类似于

odata/Products(8)?$expand=choices($select=col1,col2;$expand=item($select=name))

这在OData v4 $expand documentation 中有记录。该文档还列出了其他有用的示例,例如

Categories?$expand=Products($filter=DiscontinuedDate eq null)
Categories?$expand=Products/$count($search=blue)

【讨论】:

有效!有任何源文档吗? 确实有效。这很有趣,因为我的文档(asp.NET WebAPI)说这样的东西应该可以工作:odata/Categories?$expand=Products&$select=Name,Products/Name。这可能是 Odata v3 和 v4 之间的区别吗? 这确实是 v3 和 v4 之间的区别,就像在 ***.com/a/26746527/462781 发现的 rama 并使用 & 而不是 ;确实。 @Jerther 看看这个来源msdn.microsoft.com/en-us/library/gg334767.aspx 以供参考。 完美运行谢谢!【参考方案2】:

在选择中,可以使用实体/属性来选择展开实体的具体属性:

$select=productItemChoices/columnyouwant

我不确定您查询中的实体之间的关系。深入扩展时,我使用了以下语法(不带括号) - 在下面,我假设 Products 与 productItemChoices 和 productItemChoices 有项目

$expand=productItemChoices, productItemChoices/item

然后,选择

$select=productItemChoices/productItemChoicesGuid, productItemChoices/item/name

显然,如果关系不同,您需要对其进行一些更改

【讨论】:

我试过这个 odata/Products(08f80b45-68a9-4a9f-a516-556e69e6bd58)?$expand=productItemChoices($expand=item)&$select=productItemChoices/productItemChoicesGuid 它给了我一个错误说 "error": "code": "", "message": "URI 中指定的查询无效。在 select 子句中找到具有多个导航属性的路径。请改写您的查询,以便每个级别的 select或 expand 仅包含 TypeSegments 或 Properties。" 用更多细节编辑了答案 我在这里说的是odata v4...您给出的查询可能适用于v3 我也在使用 v4。我的 v4 服务是 ASP.NET Web API 2.2 OData。您知道端点背后的技术是什么吗?另外,为了清楚起见,我建议在查询字符串中有一个 $expand 和一个 $select - 我之前没有看到用于 $expand/$select 的嵌套括号。 这适用于我使用 SharePoint Online OData 服务。

以上是关于odata - 结合 $expand 和 $select的主要内容,如果未能解决你的问题,请参考以下文章

OData $expand、DTO 和实体框架

将 ODATA $expand 查询选项与 WebAPI 和 ViewModel 一起使用

OData - 在 $expand 中的集合上嵌套 $filter

OData $filter 与 $expand 中的项目

使用 $expand 时的 Web API OData 媒体类型格式化程序

ASP.NET C# OData 服务 + 导航属性 + $expand = null。我错过了啥?