is it possible to Query an Odata service and expand Child of Child entities?
Asked Answered
O

2

26

This sounds rather simple (and maybe I'm missing the obvious here) but I can't find a solution. I know I can query an entity and return one, or many direct child entities doing this:

var query = from c in Service.Clients.Expand("Addresses,Comments,PhoneNumbers")..

What I would like to be able to do is do the same with 3 levels (Children of child), lets say "Country->Province->City" or "Brand->Family->Model"

I tried to expand all entities, but it fails

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

Is there a way to do this in one query, or do I have to split this in two separate queries?

Oedipus answered 15/8, 2011 at 19:44 Comment(0)
G
32

The following statement should return what you are looking for:

var query = from c in Service.Brands.Expand("Families/Models")

This will run the following odata query:

.../OData.svc/Brands?$expand=Families/Models

Here is a link to some further odata documentation:

The syntax of a $expand query option is a comma-separated list of Navigation Properties. Additionally each Navigation Property can be followed by a forward slash and another Navigation Property to enable identifying a multi-level relationship.

Gerta answered 15/8, 2011 at 20:17 Comment(3)
darn, I've read that ...but dismissed it rather quickly cause I had no idea what they meant with 'graph of entities' ... #$%$ Thank you very much for pointing me, GeneOedipus
how do you make the select?Gayden
This syntax also works with the QueryableExpandAttribute gist.github.com/dbeattie71/7820af9f4ae4f68069207b49fc446c94 [QueryableExpand("GrainBins,GrainBins/GrainBinLevelHistories")]Arabic
C
34

In ASP.NET OData v4, the URL convention seems to have changed. It is now:

~/Brands?$expand=Families($expand=Models)

You can also select the stuff you want in sub-entities.
For example if you want just the brand family identifiers:

~/Brands?$expand=Families($select=Id)

Furthermore, if you want only the identifiers of the brand family models, you would do that:

~/Brands?$expand=Families($expand=Models($select=Id))

...and so on. Hope this helps !

Cobnut answered 4/11, 2014 at 22:48 Comment(5)
Does someone knows how to do this in Linq C# client??Crosseye
@AndreasFurster Did you find out?Seltzer
@Seltzer Yes. If I remember it right the .Expand(string entity) method just adds $expand=<entity param> to the url query. So you could do: .Expand("Families($expand=Models)"). Yeah it's a 'little' bit ugly... But i though it will work.Crosseye
the URL convention still uses slashes in odata v4: docs.oasis-open.org/odata/odata/v4.0/errata02/os/complete/…Polynesia
For anyone looking for this in pre v4 of oData you can use it like this instead: ?$expand=Families/Models as mentioned in the specs odata.org/documentation/odata-version-2-0/uri-conventionsJesselton
G
32

The following statement should return what you are looking for:

var query = from c in Service.Brands.Expand("Families/Models")

This will run the following odata query:

.../OData.svc/Brands?$expand=Families/Models

Here is a link to some further odata documentation:

The syntax of a $expand query option is a comma-separated list of Navigation Properties. Additionally each Navigation Property can be followed by a forward slash and another Navigation Property to enable identifying a multi-level relationship.

Gerta answered 15/8, 2011 at 20:17 Comment(3)
darn, I've read that ...but dismissed it rather quickly cause I had no idea what they meant with 'graph of entities' ... #$%$ Thank you very much for pointing me, GeneOedipus
how do you make the select?Gayden
This syntax also works with the QueryableExpandAttribute gist.github.com/dbeattie71/7820af9f4ae4f68069207b49fc446c94 [QueryableExpand("GrainBins,GrainBins/GrainBinLevelHistories")]Arabic

© 2022 - 2024 — McMap. All rights reserved.