是否有可能查询Odata服务并扩展Child of Child实体?

And*_*eas 21 linq wcf-data-services odata

这听起来很简单(也许我错过了这里显而易见的)但我找不到解决方案.我知道我可以查询实体并返回一个或多个直接子实体执行此操作:

var query = from c in Service.Clients.Expand("Addresses,Comments,PhoneNumbers")..
Run Code Online (Sandbox Code Playgroud)

我想能做的是做3个等级(孩子的孩子),让我们说"国家 - >省 - >城市"或"品牌 - >家庭 - >模型"

我试图扩展所有实体,但它失败了

var query = from c in Service.Brands.Expand("Families,Models").. //fails,
//which even makes some sense, since Models is a Child of Family, not Brand
var query = from c in Service.Brands.Expand("Families").. //this works, 
//but Family.Models is empty
Run Code Online (Sandbox Code Playgroud)

有没有办法在一个查询中执行此操作,还是必须在两个单独的查询中拆分它?

Gen*_*e C 28

以下语句应返回您要查找的内容:

var query = from c in Service.Brands.Expand("Families/Models")
Run Code Online (Sandbox Code Playgroud)

这将运行以下odata查询:

.../OData.svc/Brands?$expand=Families/Models
Run Code Online (Sandbox Code Playgroud)

以下是一些odata文档的链接:

$ expand查询选项的语法是以逗号分隔的导航属性列表.此外,每个导航属性后面都可以跟一个正斜杠和另一个导航属性,以便识别多级关系.


ram*_*ama 25

在ASP.NET OData v4中,URL约定似乎已更改.就是现在:

~/Brands?$expand=Families($expand=Models)
Run Code Online (Sandbox Code Playgroud)

您还可以在子实体中选择所需的内容.
例如,如果您只想要品牌系列标识符:

~/Brands?$expand=Families($select=Id)
Run Code Online (Sandbox Code Playgroud)

此外,如果您只想要品牌系列型号的标识符,您可以这样做:

~/Brands?$expand=Families($expand=Models($select=Id))
Run Code Online (Sandbox Code Playgroud)

...等等.希望这可以帮助 !

  • @LueTm是的.如果我记得正确的`.Expand(string实体)`方法只是增加了`$扩大= <实体param>`到URL查询.所以你可以这样做:`.Expand("Families($ expand = Models)")`.没错这就是一个"小"有点难看......但我以为它会奏效. (2认同)