我想知道是否可以过滤特定的数组元素。 我知道可以过滤嵌套属性并在集合上应用任何/所有函数,但是没有找到有关如何过滤集合上特定索引的任何文档。 作为一个例子(在Linq中表达):
data.Where(d => d.Proposals [0] .Growth.Value == 0.05m)
我期待的语法如下:
$ filter = Proposals(0)/ Growth / Value eq 0.05M
答案 0 :(得分:2)
OData基于实体数据模型,该模型不支持有序集合(数组)。因此,没有内置语法可以按位置进行过滤。
如果您的目标是使用客户端提供的值过滤默认Growth/Value
,则可以使用OData函数实现此目的。在Web API配置中声明该函数。
// builder is an instance of ODataConventionModelBuilder
var defaultGrowthValueFunction = builder.EntityType<Zebra>().Collection.Function("WhereGrowthEquals");
defaultGrowthValueFunction.Parameter<decimal>("value");
defaultGrowthValueFunction.ReturnsCollectionFromEntitySet<Zebra>("Zebras");
该函数名为WhereGrowthEquals
,并绑定到Zebras
实体集。 (我发明了一个名为Zebra
的实体类型来托管上面示例中的Proposals
数组。)
现在在ZebrasController
中定义该功能。 (为了进行测试,我定义了名为Zebra
的{{1}}个实例的静态列表。)
AllZebras
请注意,绑定函数在ODataRoute属性中是名称空间限定的。 (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));
}
}
是默认的命名空间名称。)
最后,从客户端调用函数,如下所示。
Default