0

在我目前正在开发的 OData 服务上使用 PowerQuery 时出现此错误:

写入 JSON 响应时,必须指定用户模型,并且必须将实体集和实体类型传递给 ODataMessageWriter.CreateODataEntryWriter 方法,或者必须在正在写入的 ODataEntry 或 ODataFeed 上设置 ODataFeedAndEntrySerializationInfo。

从 PowerQuery 调用返回实体集合的绑定函数时会发生这种情况。从 Web 浏览器调用时,响应为(JSON 格式):

{
    "@odata.context": "http://localhost:8080/ODataPrototype/ODataPrototype.svc/$metadata#Collection(Demo.ODataPrototype.Count)",
    "value": [
        {
            "RowCount": 1
        },
        {
            "RowCount": 2
        },
        {
            "RowCount": 3
        },
        {
            "RowCount": 4
        }
    ]
}

我使用 Olingo V4 库。我的元数据的精简版本将是:

<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
  <edmx:DataServices>
    <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="Demo.ODataPrototype">
      <EntityType Name="Instance">
        <Key>
          <PropertyRef Name="Id" />
        </Key>
        <Property Name="Id" Type="Edm.Int32" />
        <Property Name="Name" Type="Edm.String" />
        <Property Name="Description" Type="Edm.String" />
        <Property Name="Tag" Type="Edm.String" />
        <Property Name="Xid" Type="Edm.Int64" />
        <Property Name="Properties" Type="Collection(Demo.ODataPrototype.Property)" />
      </EntityType>
      <EntityType Name="Count">
        <Property Name="RowCount" Type="Edm.Int32" />
      </EntityType>
      <ComplexType Name="Property">
        <Property Name="Name" Type="Edm.String" />
        <Property Name="Value" Type="Edm.String" />
      </ComplexType>
      <Function Name="GetData" EntitySetPath="Instance/Demo.ODataPrototype.Count" IsBound="true">
        <Parameter Name="Instance" Type="Demo.ODataPrototype.Instance" />
        <Parameter Name="From" Type="Edm.DateTimeOffset" />
        <Parameter Name="To" Type="Edm.DateTimeOffset" />
        <ReturnType Type="Collection(Demo.ODataPrototype.Count)" />
      </Function>
      <EntityContainer Name="Container">
        <EntitySet Name="Instances" EntityType="Demo.ODataPrototype.Instance"></EntitySet>
        <EntitySet Name="Count" EntityType="Demo.ODataPrototype.Count" />
      </EntityContainer>
    </Schema>
  </edmx:DataServices>
</edmx:Edmx>

有人知道我错过了什么吗?

4

1 回答 1

0

我找到了解决方案。我的 JSON 响应中的上下文将结果定义为 IVserver.ODataPrototype.Count 类型的集合:

"@odata.context": "http://localhost:8080/ODataPrototype/ODataPrototype.svc/$metadata#Collection(IVserver.ODataPrototype.Count)"

但 PowerQuery 需要一个实体集:

"@odata.context": "http://localhost:8080/ODataPrototype/ODataPrototype.svc/$metadata#Count"

EntitySet "Count" 必须在 EntityContainer 中声明。

要在 @odata.context 中获取 EntitySet,必须在构建 ContextURL 时设置实体集。例子:

final ContextURL contextURL = ContextURL.with().entitySet(responseEdmEntitySet).selectList(selectList).serviceRoot(baseURI).build();

而且,不得调用asCollection()type()方法。

于 2016-02-24T08:39:43.373 回答