Я выставляю конечную точку, используя открытые типы OData, я могу очень хорошо фильтровать свойства строки, но когда я пытаюсь фильтровать DateTime / DateTimeOffset или свойство Double / Decimal, я получаю исключение приведения. Я скачал исходный код OData и воспроизвел его в своем примере проекта.
Я изменил PeopleController, чтобы он возвращал следующее:
[EnableQuery]
public IActionResult Get([FromODataUri]string keyFirstName, [FromODataUri]string keyLastName)
{
var people = new List<Person>{ new Person
{
FirstName = keyFirstName,
LastName = keyLastName,
EndDate = new DateTime(2020, 12, 11),
DynamicProperties = new Dictionary<string, object>
{
{ "abc", "abcValue" },
{ "StartDate", new DateTime(2019, 12, 11) },
{ "Quantity", 100.0 }
},
MyLevel = Level.High
},
new Person
{
FirstName = keyFirstName,
LastName = keyLastName,
EndDate = new DateTime(2018, 8, 1),
DynamicProperties = new Dictionary<string, object>
{
{ "abc", "abcValue" },
{ "StartDate", null },
{ "Quantity", 567.6 }
},
MyLevel = Level.High
}};
return Ok(people);
}
И я пытаюсь фильтровать по StartDate (open-type свойство), код OData генерирует исключение «Невозможно привести DateTime к Nullable Edm.Date». Примечание: это прекрасно работает на свойствах не открытого типа, таких как EndDate из приведенного выше кода. http://localhost: 5912 / составной / люди? KeyFirstName = John & keyLastName = Smith & $ filter = StartDate ge 2008-01-01
Кажется, код OData не может определить тип открытого Свойство type и построенное дерево выражений пытаются преобразовать базовый тип System.DateTime в Edm.Date и завершаются неудачей. Если я изменю код OData и добавлю специальный преобразователь типов, то это работает. Но затем я получаю похожую проблему с двойными / десятичными числами. Используя приведенный выше тип, если я пытаюсь фильтровать по количеству, он генерирует исключение приведения, если только я не добавлю к константе символ 'd', например, $ фильтр = Количество ле 230d
Кто-нибудь еще испытывает такие проблемы и является ли он обходной путь?