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

How can I create complex values in Microsoft.OData.Core when ODataComplexValue is missing in version 7?

我正在使用 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:class 在 master 分支中,但不在 ODatav4-7.x 分支中。

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

如何创建复杂的值?

我已经能够使用 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 
  }
};

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

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