2014-12-16 3 views
1

Я создаю веб-службу OData с использованием WebAPI и OData v4.Означает OData v4 Размеры, размеры и кубы

Мне интересно, может ли эта новая версия OData понимать размеры, меры и кубы и может выполнять запросы из данных.

Как я смогу это настроить?

+0

Что вы имеете в виду "измерения, меры, кубы"? Можете ли вы дать более подробную информацию или свои сценарии, чтобы другие могли лучше понять ваши вопросы. – QianLi

+0

Связанный вопрос: http://stackoverflow.com/questions/26020725/does-asp-net-web-api-2-2-odata4-support-group-by-clause – nlips

ответ

0

Из Overview в спецификации протокола вы можете увидеть, что:

С этой целью OData протокол выполняет следующие принципы проектирования: Предпочитают механизмы, которые работают на различных хранилищ данных. В частности, не предполагают реляционную модель данных.

Таким образом, нет ничего, что препятствовало бы моделированию данных куба с использованием OData.

Один из способов, который я могу придумать, - рассмотреть каждую сущность, заданную как куб, в которой некоторые свойства свойств навигации для каждой сущности - это размеры, которые она имеет. И он обладает множеством мерных свойств в качестве своих мер. Таким образом, запрашивая набор объектов, вы получаете весь куб. И вы можете использовать простой запрос для запроса:

GET http://host/service/Cube?$select=Dimension1,Dimension2,Measure1 & $filter=Measure1 gt 100 

Это только моя собственная простая модель. Для более сложного представления и запросов куба OData V4 имеет это расширение агрегации, которое поможет вам лучше его моделировать. Вы можете взглянуть на этот example data model, который он имеет для моделирования данных куба.

+0

Я не думаю, что ODataLib поддерживает агрегацию как of: https://aspnetwebstack.codeplex.com/workitem/1786 Это, как представляется, незавершенное производство. Спасибо в любом случае –

+0

@FrancescoFerraioli Существует запрос на вытягивание ODataLib на Github об агрегировании: https://github.com/OData/odata.net/pull/6 –

+0

Удивительный! Знаете ли вы, когда это будет доступно? –

0

Использование метода расширения LINQ QueryByCube обеспечения по AdaptiveLINQ компонента, вы можете разработать сервис анализа Queryable.

Пример запрос LINQ с помощью QueryByCube:

dataContext.MyEntitySet.QueryByCube(myCube) 
    .Where(x => x.Measure1 > 100) 
    .Select(x => new { 
     Dimension1 = x.Dimension1, 
     Dimension2 = x.Dimension2, 
     Measure1 = x.Meeasure1 
    }) 

QueryByCube действует как (Queryable) вида с неявными агрегациями.

Размеры и меры куба определяются как выражение C#. myCube - это экземпляр класса, реализующего интерфейс AdaptiveLINQ.ICubeDefinition<>.

public class MyCubeDefinition : ICubeDefinition<MySourceClass, MyCubeItem> 
{ 
    static public readonly Expression<Func<MySourceClass, string>> 
    Dimension1 = item => ... 
    static public readonly Expression<Func<MySourceClass, string>> 
    Dimension2 = item => ... 
    static public readonly Expression<Func<IEnumerbale<MySourceClass>, string>> 
    Measure1 = items => ... 
} 

QueryByCube преобразует запрос (на основе семантического анализа, чтобы определить размеры, которые будут использоваться) для того, чтобы использовать оператор GroupBy и возвращать IQueryable коллекцию.

Чтобы открыть куб в качестве запрашиваемого HTTP-сервиса, выполните ASP.Net WebAPI ODataController так:

public class MyCubeController : ODataController 
{ 
    public MyCubeController() 
    { 
    // get dataContext 
    ... 
    } 

    static MyCubeDefinition MyCube = new MyCubeDefinition(); 

    [EnableQuery] 
    public IQueryable<MyCubeItem> Get() 
    { 
     return dataContext.MyEntitySet.QueryByCube(myCube);  
    } 
} 

Теперь вы можете запросить свой куб, как это:

Mesaure1 за dimension1

http://.../MyCube?$select=Dimension1, Measure1 

Mesaure1 за (dimension1, dimension2)

http://.../MyCube?$select=Dimension1, Dimension2, Measure1 

Mesaure1 в (dimension1, dimension2) упорядочить по Mesaure1, топ 5

http://.../MyCube?$select=Dimension1, Dimension2, Measure1&$orderby=Measure1&$top=5 

Отказ от ответственности: Я разработчик AdaptiveLINQ

+0

Да, я видел этот тип ответа раньше, спасибо. Но это не позволяет клиенту запрашивать тип запроса, его определенную сторону сервера, правильно? Кроме того, что такое myCube. Im guessing dataSet - это IQueryable . –

+0

@Francesco Я доволен своим ответом. Клиент решает рассмотреть размеры и меры для вычисления, используя оператор $ select OData. – nlips

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