2017-01-05 8 views
4

У меня есть бэкэнд WebAPI, который предоставляет информацию инвентаризации и т. Д. Различным клиентам, используя ODATA v3 (я не могу использовать v4 из-за ограничения в используемом нами компоненте). База данных инвентаря довольно большая (100K + записи), а ODATA отлично подходит для фильтрации на стороне сервера, разбиения на страницы и т. Д. И сохранения передачи данных.Как получить ODATA для сериализации свойства NotMapped

Записи инвентаризации имеют некоторые свойства, которые не отображаются, а скорее вычисляются и заполняются «на лету», поскольку запросы выполняются. Например:

[NotMapped] 
public decimal RebateAmount { get; set; } 

Проблема заключается в том, что OData игнорирует любые свойства NotMapped, поэтому они никогда не отправляют обратно клиентам.

Я знаю, что это было предложено раньше, но это было некоторое время назад, теперь так я надеялся, что поддержка этого была добавлена ​​к настоящему времени, или что кто-то имеет простой обходной путь (короткий, чтобы позволить EF создать эти поля в БД).

Я попробовал этот уродливый обходной путь, но он не работает (RebateAmount еще не получает включено OData):

private decimal _rebateAmount; 
public decimal RebateAmount { get {return _rebateAmount; } } 

public void SetRebateAmount(decimal amount) 
{ 
    _rebateAmount = amount; 
} 

Есть ли (желательно простой) способ включать в себя свойство без БД в Наборы результатов ODATA?

Редактировать 1/7/2017 Для этого, чтобы быть полезным в моем сценарии, OData должен также включать вычисляемые поля в его метаданных, в противном случае автоматически генерируемые (на стороне клиента) прокси-классы не будут включать их.

ответ

2

Одним из подходов может быть создание OData EDMModel с объектом DTO с дополнительным вычисленным свойством.

Пожалуйста, проверьте этот ответ, который имеет детали реализации, чтобы сделать это: Mapping OData query against a DTO to another entity?

DTO может быть отображен с помощью View на сервере базы данных или может быть вычислен в контроллере с помощью OdataQueryOptions.

+0

Я начал реализовывать ваше предложение, но оказалось, что он добавляет немного сложности (больше, чем мне удобно для этого); если есть не менее интрузивный способ выполнить это, я просто укушу пулю и поместил бы свойства в БД. Но спасибо за ваше предложение! – Lars335

+0

Я забыл упомянуть, что я использую ODATA 3 (я обновил вопрос), поэтому это объясняет хотя бы одну проблему, которую я испытывал при попытке реализовать ваше предложение. В любом случае, я поддержал вас за то, что нашел время, чтобы предложить возможное решение. – Lars335

+0

Мне пришлось реализовать такой случай раньше, и, к сожалению, я не смог найти более простого решения для этого и создал пользовательский IQueryable с помощью OdataQueryOptions для работы с пользовательским EdmModel. Я бы ответил на этот вопрос, чтобы узнать о лучших решениях. – Ankit

0

Я знаю, что это старое сообщение, но в файле WebApiConfig просто добавьте следующее, и оно откроет свойство «NotMapped».

builder.StructuralTypes.First(t => t.ClrType == typeof(YourModel)).AddProperty(typeof(YourModel).GetProperty("RebateAmount")); 

Где «строитель» - это ваш IEdmModel. Скорее всего, в методе GetEdmModel.

 Смежные вопросы

  • Нет связанных вопросов^_^