我正在使用WebAPI和OData v4构建OData Web服务。
我想知道这个新版本的OData是否能够理解Dimension,Measures和Cubes,并且能够从数据中执行查询。
我如何配置?
答案 0 :(得分:0)
从协议规范的Overview您可以看到:
为此,OData协议遵循以下设计原则:首选适用于各种数据存储的机制。特别是,不假设关系数据模型。
因此,没有任何东西阻止您使用OData建模立方体数据。
我能想到的一种方法是将每个实体设置为一个多维数据集,其中包含一些属性和一些属性。每个实体的导航属性是它具有的维度。并且它有一堆度量属性作为其度量。因此,通过查询实体集,您可以获得整个多维数据集。您可以使用一些简单的查询来查询它:
GET http://host/service/Cube?$select=Dimension1,Dimension2,Measure1 & $filter=Measure1 gt 100
这只是我自己的简单模型。对于更复杂的多维数据集表示和可查询性,OData V4具有此聚合扩展,可帮助您更好地对其进行建模。您可以查看它对立方体数据建模所需的example data model。
答案 1 :(得分:0)
使用AdaptiveLINQ组件提供的LINQ扩展方法QueryByCube
,您可以开发可查询分析服务。
使用QueryByCube
示例LINQ查询:
dataContext.MyEntitySet.QueryByCube(myCube)
.Where(x => x.Measure1 > 100)
.Select(x => new {
Dimension1 = x.Dimension1,
Dimension2 = x.Dimension2,
Measure1 = x.Meeasure1
})
QueryByCube
充当具有隐式聚合的(可查询)视图。
多维数据集维度和度量定义为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);
}
}
现在您可以像这样查询您的多维数据集:
每个维度1的Mesaure1
http://.../MyCube?$select=Dimension1, Measure1
Mesaure1 per(Dimension1,Dimension2)
http://.../MyCube?$select=Dimension1, Dimension2, Measure1
Mesaure1 per(Dimension1,Dimension2)顺序由Mesaure1,前5
http://.../MyCube?$select=Dimension1, Dimension2, Measure1&$orderby=Measure1&$top=5
免责声明:我是AdaptiveLINQ开发人员