2016-01-21 6 views
4

В asp.net Web API2, когда вы создаете асинхронную контроллер веб-интерфейс для модели с рамкой объекта, по умолчанию первого метод в новом контроллере, как это:Почему метод GET на веб-API asp.net возвращает IQueryable?

public IQueryable<MyModel> GetMyModel() 
{ 
    return db.MyModel; 
} 

Выход JSON из этого метода является всего лишь массивом всех записей MyModel. Между тем, все другие методы для POST, PUT, GET (int id) и DELETE отмечены как async и возвращают Task<IHttpActionResult>. Почему это не первый метод GET в том же стиле, что-то вроде этого:

public async Task<IHttpActionResult> GetMyModel() 
{ 
    return Ok(await db.MyModel.ToArrayAsync()); 
} 

Я попробовал это, и он производит идентичный вывод в формате JSON.

ответ

4

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

Позвонив по телефону ToArrayAsync(), вы по существу делаете ненужную работу, и это будет сделано для вас позже.

0

Это IQuerable, потому что вызывающий API может передать фильтр, который будет добавлен в ваш dBset, чтобы вы получили отфильтрованные данные. Приведу один пример. Подумайте, что у MyModal есть 3 свойства Id, Name, Deleted. Если вашему клиентскому приложению требовались все строки, только не удаленные строки, вам нужно создать для этого два двух отдельных действия. Но используя IQuerable, вы можете уменьшить его.

  1. Для всех строк: {хост}/апи/MyModal
  2. Для Неудаленных строк: {хост}/API/MyModal $ фильтра (Исключены э лжи)

И может больше фильтры, такие как top, skip, lineCount. Даже вы можете делать разбивку на страницы с помощью IQureable. И Web API будет работать как Async, поэтому нужно явно писать Async.