Как создать сложные значения в Microsoft.OData.Core, если в версии 7 отсутствует ODataComplexValue?

Я анализирую метаданные из службы OData, используя Microsoft.OData (ODataLib) версии 7.

После анализа 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")
      }  
    }
};

Однако ODataComplexValue не существует в версии 7 (последняя версия NuGet).

Я взглянул на github: класс находится в ветке master, но не в ветке ODatav4-7.x.

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

Как я могу создать сложные ценности?

1 ответ

Решение

Мне удалось создать комплексное значение с OData 7, хотя это больше похоже на обходной путь.

Я использовал ODataUntypedValue и сам сериализовал сложный объект, используя Newtonsoft.Json.

Прежде всего, в примечаниях к выпуску говорится, что ODataComplexValue был заменен ODataResource.

http://odata.github.io/odata.net/v7/

Однако это не может использоваться для значения 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+) представлен ODataResourceValue, который эквивалентен ODataComplexValue.

Другие вопросы по тегам