Можно ли отобразить запросы Linq из одной модели данных в запрос поверх другой модели данных?
Я хотел бы предоставить интерфейс OData для моего приложения. Примеры, которые я видел, используют EF для отображения запросов LINQ на запросы SQL.
ИМХО, этот подход в значительной степени предоставляет миру физическую модель базы данных (я знаю, что EF/NH дают некоторую гибкость, но она ограничена).
То, что я хотел бы сделать, это следующее:
- Определите мой контракт данных через несколько DTO.
- Иметь службу OData, которая позволит пользователям запрашивать данные моего контракта с данными.
- Иметь некоторый уровень перевода для перевода запросов через DTO в запросы, скажем, по модели EF или NH.
- Выполните переведенный запрос.
- Сопоставьте результаты с моими Контрактами на данные.
Я сошел с ума или есть решение этой проблемы?
2 ответа
Один из способов сделать это - создать ViewModel, который будет представлять вашу модель, а затем использовать AutoMapper для сопоставления между ними. Вы можете использовать как это:
var address = _Context.Addresses.Where(p => p.AddressID == addressID).Single();
AddressVM result = Mapper.Map<AddressVM>(address);
У меня есть 2 модели: "контрактная" модель и "постоянная" модель. Постоянная модель - это то, на что отображается Entity Framework. Метод Get, который возвращает IQueryable, возвращает IQueryable, который представляет собой нечто вроде:
return dbContext.PersistedCustomers.Select(x => new Customer(Name = x.OtherName, ...));
По крайней мере, при использовании DbContext в отличие от ObjectContext, где критерии, основанные на модели контракта, автоматически переводятся в условия, где критерии PersistedModel должны выполняться для базы данных. Надеемся, что различия между ними не настолько сложны, что вам нужно какое-то странное массирование данных. Я уверен, что есть пределы для разворота, которое это делает.