o数组元素上的数据筛选器

本文关键字:筛选 数据 数组元素 | 更新日期: 2023-09-27 18:28:03

我想知道是否可以对特定的数组元素进行筛选。我知道可以对嵌套属性进行筛选,也可以对集合应用任何/所有函数,但没有找到任何关于如何对集合的特定索引进行筛选的文档。举个例子(用Linq表示):

数据。其中(d=>d.建议书[0]。增长值==0.05m)

我期待一个语法像:

$filter=提案(0)/增长/价值eq 0.05M

o数组元素上的数据筛选器

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中的函数。(为了测试,我定义了一个名为AllZebrasZebra实例的静态列表。)

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));
    }
}

请注意,绑定函数在ODataRoute属性中是命名空间限定的。(Default是默认的命名空间名称。)

最后,从客户端调用函数,如下所示。

GET http://hostname/Zebras/Default.WhereGrowthEquals(value=0.05)
相关文章: