4

This question очень похож, но не дает мне то, что мне нужно.

Я использую Entity Framework 6. В моей базе данных есть две таблицы: Customer и CustomerTypes. Я создал ViewModel для каждого. Клиент может иметь тип:

public class Customer 
{ 
    public int CustomerID { get; set; } 
    public string CustomerName { get; set; } 
    public CustomerTypeViewModel CustomerType { get; set; } 
} 

public class CustomerTypeViewModel 
{ 
    public int CustomerTypeID { get; set; } 
    public string CustomerTypeDescription { get; set; } 
} 

У меня есть контроллер клиента который предоставляет метод OData действия с типом возвращаемого IQueryable:

[HttpPost, Queryable(AllowedQueryOptions = AllowedQueryOptions.All)] 
    public IQueryable<CustomerViewModel> GetCustomersMatchingCriteria([FromBody]ODataActionParameters parameters) 
    { 
     var criteria = (CustomerMassUpdateCriteriaViewModel)parameters["Criteria"]; 

     return Common.Customers.GetCustomerMassUpdateCriteriaResults(criteria, 
      ConfigurationManager.AppSettings["CLIENT_ID"]).Select(
      c => new CustomerViewModel() 
      { 
       CustomerID = c.CustomerID, 
       CustomerName = c.CustomerName, 
       CustomerType = new CustomerTypeViewModel() 
       { 
        CustomerTypeDescription = c.CustomerType.CustomerTypeDescription 
       } 
      }); 
    } 

Метод Common.Customers.GetCustomerMassUpdateCriteriaResults просто возвращает IQueryable клиента, который является фактическим лицом.

Проблема, при вызове этого метода контроллера со следующими параметрами строки запроса:

$expand=CustomerType 
$select=CustomerID,CustomerName,CustomerType/CustomerTypeDescription 

Это исключение:

типа «ObjectContent`1» не удалось сериализовать тело ответа для типа контента 'application/json; кодировка = UTF-8' , "типа. ":". System.InvalidOperationException»

Аргумент DbIsNullExpression должен относиться к примитивным, перечисление или ссылочного типа

Удаление $ расширить опции и ассоциированная CustomerType/CustomerTypeDescription свойство от $ списка выбора не производит ошибки

Я чувствую, что я что-то очевидное отсутствую, здесь Любые идеи

1st EDIT:..?

Перечисление результатов с помощью метода расширения ToList() и возврата IEnumerable, а не IQueryable, успешно расширяет свойство навигации CustomerType, но мой список выбора ODATA $ больше не соблюдается на уровне базы данных. Разве это не побеждает цель использования ODATA?

+0

ли вы в конечном итоге с раствором для этого? Я все еще пытаюсь сортировать это. – Josh

+0

@ Josh, нет, я этого не делал. То, что я закончил, было создание более специфичного v iewmodel (или dto или что бы то ни было ваше дело) для моей потребности.Мне нужно было получить доступ к свойству вложенного свойства, и было бы неплохо получить эту работу с «$ expand», но вместо этого я просто придерживался этого свойства на моей основной модели просмотра и отказался от опции «$ expand» и вложенное свойство. Из-за этого мне пришлось переосмыслить некоторые вещи по-архитектурному, и мне не очень нравится это решение, но, по-видимому, это единственный вариант, который у меня есть на данный момент. – aardvark

ответ

0

Исключение:

Тип '' ObjectContent`1 не удалось сериализовать тело ответа для контента типа «приложения/JSON; кодировка типа = UTF-8' , ".„:“System.InvalidOperationException»

мне известно из-за того, как запрос для достижения OData форматирования Запрос должен прийти к маршруту OData для форматирования Если.. вы могли бы двигаться GlobalConfiguration.Configuration.EnableOData() перед тем RouteConfig.RegisterRoutes и WebApiConfig.Register в global.asax может помочь.

+0

Из того, что я понимаю, атрибут Queryable (AllowedQueryOptions = AllowedQueryOptions.All) должен делать то же самое на более локальном уровне, но я попытался попробовать ваше предложение и обнаружил, что метод EnableOData() не является членом GlobalConfiguration .Configuration. Возможно, он недоступен в WebAPI 5.0? – aardvark

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