3

我正在使用 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 (最新的 NuGet 版本)中不存在 ODataComplexValue 。

我查看了 github:该类在 master 分支中,但不在 ODatav4-7.x 分支中。

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

如何创建复杂的值?

4

2 回答 2

2

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

于 2019-07-31T22:52:56.603 回答
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 
  }
};

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

于 2017-04-07T10:01:02.743 回答