2015-12-24 5 views
0

Я хотел знать, можно ли фильтровать определенный элемент массива. Я знаю, что можно фильтровать на вложенные свойства и применять любые/все функции в коллекциях, но не нашел никакой документации о том, как фильтровать определенный индекс в коллекции. В качестве примера (в Linq):Фильтр oData на элементе массива

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

Я ожидал синтаксис как:

$ = фильтр Предложения (0)/Growth/Значение эк 0,05М

ответ

2

OData основан на модели EDM, которая не поддерживает упорядоченные коллекции (ар лучи). Таким образом, нет встроенного синтаксиса для фильтрации по положению.

Если ваша цель состоит в том, чтобы отфильтровать по умолчанию Growth/Value с использованием значения, предоставленного клиентом, вы можете достичь этого с помощью функции OData. Объявите функцию в конфигурации вашего веб-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 экземпляров под названием 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)); 
    } 
} 

Обратите внимание, что связанная функция пространства имен, в атрибуте ODataRoute. (Default - это имя пространства имен по умолчанию.)

Наконец, вызовите функцию от клиента следующим образом.

GET http://hostname/Zebras/Default.WhereGrowthEquals(value=0.05) 
+0

Благодарим за подробный ответ. На самом деле мне нужно выразить запрос фильтра в общем виде, я не могу реализовать определенную фильтрацию на стороне сервера. Я имею в виду, что запросы должны генерироваться сеткой клиента в зависимости от показанных столбцов, а эти столбцы представляют собой проекцию сложных объектов (включая массивы). Я мог бы иметь еще один столбец, ссылающийся на путь, подобный предложениям [1]. Другой экземпляр [2] .Amount.Value. Итак, я ищу стандартный и общий syntaxt для выражения этого пути в запросе OData. – enenkey

+0

Хммм. Мне любопытно, как вы моделируете массивы. Как выглядит ваш документ с метаданными $? – lencharest

Смежные вопросы