Nested $filter in $expand
Applies To:# OData WebApi v7 for aspnet webapi supported OData AspNet WebApi V7# OData Webapi for Webapi supported OData AspNet WebApi V6
OData Web API v5.5 supports nested $filter in $expand, e.g.:
.../Customers?$expand=Orders($filter=Id eq 10)
POCO classes:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<Order> Orders { get; set; }
}
public class Order
{
public int Id { get; set; }
public string Name { get; set; }
}
With Edm model built as follows:
var builder = new ODataConventionModelBuilder(config);
builder.EntitySet<Customer>("Customers");
var model = builder.GetEdmModel();
To Map route,
- For Microsoft.AspNet.OData, e.g., in
WebApiConfig.cs
:
config.MapODataServiceRoute("orest", "orest", model);
- For Microsoft.AspNetCore.OData, e.g., in
Startup.Configure((IApplicationBuilder app, IHostingEnvironment env)
method:
app.UseMvc(routeBuilder =>
{
routeBuilder.Select().Expand().Filter().OrderBy().MaxTop(null).Count();
routeBuilder.MapODataServiceRoute("orest", "orest", model);
});
Controller:
public class CustomersController : ODataController
{
private Customer[] _customers =
{
new Customer
{
Id = 0,
Name = "abc",
Orders = new[]
{
new Order { Id = 10, Name = "xyz" },
new Order { Id = 11, Name = "def" },
}
}
};
[EnableQuery]
public IHttpActionResult Get()
{
return Ok(_customers.AsQueryable());
}
}
Request:
https://localhost:port_number/orest/Customers?$expand=Orders($filter=Id eq 10)
Response:
{
"@odata.context": "https://localhost:52953/orest/$metadata#Customers",
"value": [
{
"Id": 0,
"Name": "abc",
"Orders": [
{
"Id": 10,
"Name": "xyz"
}
]
}
]
}
Feedback
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Submit and view feedback for