从.NET OData 4 Client调用嵌套的Expand()的正确方法

Ada*_*ess 8 astoria wcf-data-services odata asp.net-web-api wcf-data-services-client

问题

在Web API上的OData 4服务中,从.NET客户端调用嵌套$ expand的正确方法是什么?我们正在使用OData客户端生成器.回到之前使用OData 3服务的WCF数据服务,我们可以调用.Expand("Customers/Orders").在使用OData 4的Web API中,我们不能再这样做,并且如果您尝试,则会收到以下内容.Expand("Customers/Orders"):

URI中指定的查询无效.找到遍历多个导航>属性的路径.请重新调整查询,使每个展开路径仅包含类型>段和导航属性.

解决方法

我们可以通过调用expand来解决这个问题:.Expand("Customers($expand=Orders)").在非嵌套的$ expand场景中,我喜欢lambda支持.Expand(d => d.Customers)..NET OData 4客户端是否有正确的方法来调用嵌套的扩展而没有不幸的魔术字符串.Expand("Customers($expand=Orders)")?如果没有,是否有一个更清洁的字符串模式,如"客户/订单",这将有效吗?谢谢.

Tan*_*nfu 1

在OData v4中,展开多级是无效的,例如您在问题中提到的:.Expand(“Customers/Orders”)。我认为客户端不会支持这样的API。以下是 ABNF http://docs.oasis-open.org/odata/odata/v4.0/os/abnf/odata-abnf-construction-rules.txt中的内容:

expand            = '$expand' EQ expandItem *( COMMA expandItem )
expandItem        = STAR [ ref / OPEN levels CLOSE ]
                  / expandPath
                    [ ref   [ OPEN expandRefOption   *( SEMI expandRefOption   ) CLOSE ]
                    / count [ OPEN expandCountOption *( SEMI expandCountOption ) CLOSE ]
                    /         OPEN expandOption      *( SEMI expandOption      ) CLOSE 
                    ]
expandPath        = [ qualifiedEntityTypeName "/" ] 
                    *( ( complexProperty / complexColProperty ) "/" [ qualifiedComplexTypeName "/" ] )
                    navigationProperty 
                    [ "/" qualifiedEntityTypeName ]
Run Code Online (Sandbox Code Playgroud)

  • @Tan_Jinfu 谢谢,这是很好的信息。但这引出了一个问题,为什么“$expand=Customers($expand=Orders)”在 MS 实现中起作用? (2认同)
  • 因为 $expand=Customers($expand=Orders) 中的 $expand=Orders 被称为查询选项,而查询选项可以是 $filter 或另一个 $expand,ABNF 为:expandOption = ExpandRefOption / select / Expand /levels (2认同)