[英]OData function returning a collection of entities fails with PowerQuery
在我目前正在開發的 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>
有誰知道我錯過了什么?
我找到了解決方案。 我的 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 時設置一個entityset。 例子:
final ContextURL contextURL = ContextURL.with().entitySet(responseEdmEntitySet).selectList(selectList).serviceRoot(baseURI).build();
並且,不得調用方法asCollection()和type() 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.