У меня есть настройка, где я получаю услугу OAata WebApi, которая возвращает: Клиенты. Код для возвращения клиентов является:
public IHttpActionResult GetCustomers(ODataQueryOptions<Customer> queryOptions)
{
return Ok(context.Customers.Where(i => i.IsActive).AsQueryable());
}
Так метод GetCustomers возвращает IQuerable результат всех активных клиентов. Для целей истории мы оставляем всех клиентов в базе данных, но когда клиент удален, мы устанавливаем поле IsActive в значение false.
Настройка OData создается с помощью простого builder.EntitySet для создания Url для объектов.
EntitySetConfiguration<Customer> customers = builder.EntitySet<Customer>("customers");
Это работает безупречно. У меня есть угловой интерфейс, который использует вызовы $ http для получения клиентов и т. Д.
Однако клиент может содержать связанные контакты в базе данных. Для того, чтобы получить контакты в угловом Frontend, я использую $ расширить функциональность OData:
odata/customers?$expand=contacts
Это также отлично работает. Я получаю клиентов со всеми связанными контактами. Однако, как вы догадались, мне хотелось бы получить только те контакты, которые должны быть возвращены IsActive. И функциональность IQueryable возвращает мне все результаты.
Я понимаю, что могу использовать отдельный вызов Odata для получения контактов, но я действительно хотел бы использовать функции $ expand для получения всех данных за один вызов. Я знаю, что также могу выполнять фильтрацию на стороне клиента (с помощью фильтра $). Но я хотел бы установить это правильно в части WebApi, поэтому клиенту не нужно заботиться о фильтрации неактивных результатов.
Я не могу понять, как это сделать правильно. Может ли кто-нибудь помочь мне встать на правильный путь?
Вы можете сделать это с помощью Eager loading? https://msdn.microsoft.com/en-us/data/jj574232.aspx?f=255&MSPPError=-2147217396 –
Александр, это может быть решение, однако, я не хотел бы получать контакты каждый раз, когда вы получаете клиентов. –
Не могли бы вы попытаться вернуть 'IQueryable'? –
csharpfolk