Как создать сложные значения в 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.