o数组元素

时间:2015-12-24 16:22:27

标签: c# rest odata

我想知道是否可以过滤特定的数组元素。 我知道可以过滤嵌套属性并在集合上应用任何/所有函数,但是没有找到有关如何过滤集合上特定索引的任何文档。 作为一个例子(在Linq中表达):

  

data.Where(d => d.Proposals [0] .Growth.Value == 0.05m)

我期待的语法如下:

  

$ filter = Proposals(0)/ Growth / Value eq 0.05M

1 个答案:

答案 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