OData is based on the Entity Data Model, which does not support ordered collections (arrays). So there is no built-in syntax for filtering by position.
If your goal is to filter against a default Growth/Value using a client-supplied value, you can achieve that with an OData function. Declare the function in your Web API config.
// builder is an instance of ODataConventionModelBuilder
var defaultGrowthValueFunction = builder.EntityType<Zebra>().Collection.Function("WhereGrowthEquals");
defaultGrowthValueFunction.Parameter<decimal>("value");
defaultGrowthValueFunction.ReturnsCollectionFromEntitySet<Zebra>("Zebras");
The function is named WhereGrowthEquals and it is bound to the Zebras entity set. (I've invented an entity type named Zebra to host the Proposals array from your example above.)
Now define the function in the ZebrasController. (For testing, I defined a static list of Zebra instances named AllZebras.)
public class ZebrasController : ODataController
{
[HttpGet]
[ODataRoute("Zebras/Default.WhereGrowthEquals(value={value})")]
public IHttpActionResult WhereGrowthEquals(decimal value)
{
return this.Ok(AllZebras.Where(z => z.Proposals[0].Growth.Value == value));
}
}
Note that the bound function is namespace-qualified in the ODataRoute attribute. (Default is the default namespace name.)
Finally, invoke the function from the client as follows.
GET http://hostname/Zebras/Default.WhereGrowthEquals(value=0.05)