Я создаю веб-службу OData с использованием WebAPI и OData v4.Означает OData v4 Размеры, размеры и кубы
Мне интересно, может ли эта новая версия OData понимать размеры, меры и кубы и может выполнять запросы из данных.
Как я смогу это настроить?
Я создаю веб-службу OData с использованием WebAPI и OData v4.Означает OData v4 Размеры, размеры и кубы
Мне интересно, может ли эта новая версия OData понимать размеры, меры и кубы и может выполнять запросы из данных.
Как я смогу это настроить?
Из Overview в спецификации протокола вы можете увидеть, что:
С этой целью OData протокол выполняет следующие принципы проектирования: Предпочитают механизмы, которые работают на различных хранилищ данных. В частности, не предполагают реляционную модель данных.
Таким образом, нет ничего, что препятствовало бы моделированию данных куба с использованием OData.
Один из способов, который я могу придумать, - рассмотреть каждую сущность, заданную как куб, в которой некоторые свойства свойств навигации для каждой сущности - это размеры, которые она имеет. И он обладает множеством мерных свойств в качестве своих мер. Таким образом, запрашивая набор объектов, вы получаете весь куб. И вы можете использовать простой запрос для запроса:
GET http://host/service/Cube?$select=Dimension1,Dimension2,Measure1 & $filter=Measure1 gt 100
Это только моя собственная простая модель. Для более сложного представления и запросов куба OData V4 имеет это расширение агрегации, которое поможет вам лучше его моделировать. Вы можете взглянуть на этот example data model, который он имеет для моделирования данных куба.
Я не думаю, что ODataLib поддерживает агрегацию как of: https://aspnetwebstack.codeplex.com/workitem/1786 Это, как представляется, незавершенное производство. Спасибо в любом случае –
@FrancescoFerraioli Существует запрос на вытягивание ODataLib на Github об агрегировании: https://github.com/OData/odata.net/pull/6 –
Удивительный! Знаете ли вы, когда это будет доступно? –
Использование метода расширения 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
Да, я видел этот тип ответа раньше, спасибо. Но это не позволяет клиенту запрашивать тип запроса, его определенную сторону сервера, правильно? Кроме того, что такое myCube. Im guessing dataSet - это IQueryable
@Francesco Я доволен своим ответом. Клиент решает рассмотреть размеры и меры для вычисления, используя оператор $ select OData. – nlips
Что вы имеете в виду "измерения, меры, кубы"? Можете ли вы дать более подробную информацию или свои сценарии, чтобы другие могли лучше понять ваши вопросы. – QianLi
Связанный вопрос: http://stackoverflow.com/questions/26020725/does-asp-net-web-api-2-2-odata4-support-group-by-clause – nlips