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