Как мне сопоставить запрос 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, который, кажется, мог бы помочь с этим, но он не так чист, как я надеялся.
Кто-нибудь может дать мне несколько советов по решению этой проблемы? Есть ли лучший подход?