. Net Core - открытый тип ODATA - фильтрация по свойству DateTime / Double вызывает исключение - PullRequest
0 голосов
/ 12 марта 2020

Я выставляю конечную точку, используя открытые типы 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

Кто-нибудь еще испытывает такие проблемы и является ли он обходной путь?

...