当版本7中缺少ODataComplexValue时,如何在Microsoft.OData.Core中创建复杂值?

时间:2017-04-04 14:12:34

标签: c# odata odatalib microsoft-odata

我使用Microsoft.OData(ODataLib)版本7解析OData服务中的元数据。

在解析ODataModel之后,我想创建一个带有所有声明属性的样本值的示例消息。

到目前为止一切顺利。适用于属性中的原始值,或枚举甚至集合值。

原始值的示例:

var property = new ODataProperty() {
    Name = "Key",
    Value = new ODataPrimitiveValue("Value")
};

我想像这样创建一个复杂的值:

var property = new ODataProperty() {
    Name = "Key",
    Value = new ODataComplexValue() {
      Properties = new List<ODataProperty>() {
        new ODataPrimitiveValue("Value")
      }  
    }
};

但是,版本7中不存在ODataComplexValue (最新的NuGet版本)。

我看了一下github:这个类在master分支中,但不在ODatav4-7.x分支中。

https://github.com/OData/odata.net/tree/master/src/Microsoft.OData.Core

如何创建复杂的值?

2 个答案:

答案 0 :(得分:2)

我已经能够使用OData 7生成复杂的价值,尽管感觉更像是一种解决方法。

我使用了ODataUntypedValue并使用Newtonsoft.Json自行序列化了复杂对象。

首先,它在发行说明中说ODataComplexValue被ODataResource取代。

http://odata.github.io/odata.net/v7/#23-17-Merge-Entity-And-Complex-Breaking

但是,这不能用于ODataProperty的值,因为它不是ODataValue。

由于库不会对复杂值进行序列化,因此使用Newtonsoft.Json进行显式序列化的实现:

// propertiesObject is a POCO I've dynamically created using ExpandoObject
var complexObject = JsonConvert.SerializeObject(propertiesObject);

var property = new ODataProperty() {
  Name = "Key"
  Value = new ODataUntypedValue() {
    RawValue = complexObject 
  }
};

对于图书馆在这方面感到如此不一致的任何其他解决方案或见解将不胜感激。

答案 1 :(得分:0)

较新的ODL版本(7.5.3+)引入了ODataResourceValue,它等效于ODataComplexValue。