-
Type: Improvement
-
Status: Closed
-
Priority: Major
-
Resolution: Fixed
-
Affects Version/s: V4.01_CSD01
-
Fix Version/s: V4.01_CSD02
-
Component/s: Vocabularies
-
Labels:None
-
Proposal:
-
Resolution:
There is currently no easy way (read: without specifying an additional wrapper entity type) of specifying a, what most people would likely refer to as a, dictionary, or a collection of name/value pair, in which I can specify the type of the values!
So where we would need to do something today like:
<EntityType Name="ValueType">
<Key>
<PropertyRef Name="Key"/>
</Key>
<Property Name="Key" Type="Edm.String" Nullable="false"/>
<Property Name="PropA" ... />
...
</EntityType>
<EntityType Name="ValueTypeDictionaryWrapper">
<Key>
<PropertyRef Name="Name"/>
</Key>
<Property Name="Name" Type="Edm.String" Nullable="false"/>
<NavigationProperty Name="Value" Type="ns.ValueType" Nullable="false"/>
</EntityType>
<AnyStructuredType Name="ValueTypeDictionaryContainer">
...
<NavigationProperty Name="Values" Type="Collection(ns.ValueTypeDictionaryWrapper)" Nullable="false"/>
...
</AnyStructuredType>
Note that the wrapper has to be an entity type to be able to use the name (key) to index into the 'dictionary'. This is even a bit weirder if what we are putting in the dictionary is actually complex types that one would want to treat just like a collection of that complex type.
The payload would look something like this:
{
"@odata.context": "$metadata#AnyStructuredType(Values(Value))/$entity",
...,
"Values": [{
"Name": "foo",
"Value":
,
"Name": "bar",
"Value":
,
...
}],
...
}
Needless to say that this JSON representation of an, expanded, payload doesn't look like what a typical JSON consumer would expect and it requiring the wrapped value to be expanded as well..
So what I'm looking at being able to do is, using the same example, do something like:
<EntityType Name="ValueType">
<Key>
<PropertyRef Name="Key"/>
</Key>
<Property Name="Key" Type="Edm.String" Nullable="false"/>
<Property Name="PropA" ... />
...
</EntityType>
<AnyStructuredType Name="ValueTypeDictionaryContainer">
...
<NavigationProperty Name="Values" Type="Dictionary(ns.ValueTypeDictionaryWrapper)" Nullable="false"/>
...
</AnyStructuredType>
And the resulting JSON payload for requests would look something like:
{
"@odata.context": "$metadata#AnyStructuredType(Values)/$entity",
...,
"Values": {
"foo":
,
"bar":
,
...
},
...
}
Note the more intuitive typical JSON response and that we don't need to expand the value in the wrapper any longer.