OData v4是否了解维度,度量和多维数据集

时间:2014-12-16 05:07:45

标签: odata asp.net-web-api2 dimensions cubes measures

我正在使用WebAPI和OData v4构建OData Web服务。

我想知道这个新版本的OData是否能够理解Dimension,Measures和Cubes,并且能够从数据中执行查询。

我如何配置?

2 个答案:

答案 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开发人员