Я бы выбрал между IEnumerable и IHttpActionResult, вы можете сделать почти то же самое с обоими из них только несколько разными способами. IQueryable обычно используется для задач доступа к данным более низкого уровня и отложенного выполнения sql-запросов, поэтому я бы сохранил его инкапсулированным в ваших классах доступа к данным и не подвергал его веб-ави.
Вот резюме от http://www.asp.net/web-api/overview/web-api-routing-and-actions/action-results:
IHttpActionResult
Интерфейс IHttpActionResult был Введены в Web API 2. По существу, он определяет HttpResponseMessage завод. Вот некоторые преимущества использования интерфейса IHttpActionResult (по классу HttpResponseMessage):
- Упрощает модульное тестирование контроллеров.
- Перемещает общую логику для создания ответов HTTP на отдельные классы.
- Делает намерение действия контроллера более ясным, скрывая детали низкого уровня построения ответа.
IEnumerable <Item>
Для всех других типов возврата, Web API использует медиа форматировщик для сериализации возвращаемого значения. Web API записывает сериализованное значение в тело ответа. Код состояния ответа - 200 (OK).
public class ProductsController : ApiController
{
public IEnumerable<Product> Get()
{
return GetAllProductsFromDB();
}
}
Недостатком этого подхода является то, что вы не можете напрямую возвращать код ошибки, например, 404. Тем не менее, вы можете бросить HttpResponseException коды ошибок. Чтобы получить больше информации.
Если ваш метод действия не включает использование ключевого слова 'await', вы не должны возвращать' Task'.Вместо этого вы должны просто вернуть 'IHttpActionResult',' IEnumerable 'или' IQueryable '. См. Вопрос [IHttpActionResult vs async Task ] (https://stackoverflow.com/q/29100732/1497596). Также см. Вопрос [Эффективно использовать async/wait с ASP.NET Web API] (https://stackoverflow.com/q/31185072/1497596). –
DavidRR