Как мне сопоставить запрос OData с DTO к объекту EF?

У меня есть ODataController в приложении Asp.Net Web Api, которое позволяет запросы OData. Я разрешаю только чтение, а не обновления. Вместо непосредственного представления модели данных я создал набор DTO. Имена свойств в DTO не обязательно совпадают со свойствами в модели EF. Это вызывает проблему, когда я пытаюсь использовать запрос OData к модели EF. Я просмотрел другие посты в StackOverflow по этой теме, но ни одна из них, похоже, не решила эту проблему.

Вот что у меня сейчас есть:

public IQueryable<Customer> GetCustomer(ODataQueryOptions<Customer> query)
{
        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Customer>("Customers");
        builder.EntitySet<RECORD>("Records");
        builder.Namespace = "MyDataService.Models";

        var opts = new ODataQueryOptions<RECORD>(new ODataQueryContext(builder.GetEdmModel(), typeof(RECORD)), this.ActionContext.Request);
        var records = (IQueryable<RECORD>)opts.ApplyTo(db.RECORDS);
        return ConvertToCustomerList(records);
}

Это работает, пока я не буду ссылаться на определенные поля в выборе или фильтре. Как только я ссылаюсь на поле в своем запросе OData, я получаю ODataException вроде -Could not find a property named 'LastName' on type 'MyDataService.Models.RECORD, Это потому, что свойства EF имеют другое соглашение об именах. В этом случае следует использовать «LAST_NAME».

Похоже, мне нужно проанализировать запрос, а затем заменить ссылки на поля с правильными именами. Я нашел ODataUriParser, который, кажется, мог бы помочь с этим, но он не так чист, как я надеялся.

Кто-нибудь может дать мне несколько советов по решению этой проблемы? Есть ли лучший подход?

Ответы на вопрос(1)

Ваш ответ на вопрос