2015-06-03 1 views
1

Я пытаюсь получить $ выберите часть ODataQueryOptions, работающий с моей бизнес-слоем, и я не могу показаться, чтобы лапша способ (FYI: размещение запроса EF в моем контроллере не вариант) ..

Здесь мой метод ODataController

public async Task<IHttpActionResult> Get(Guid propertyId, ODataQueryOptions<HighSchoolViewModel> odataOptions) 
    { 
     // validate the query. 
     try 
     { 
      odataOptions.Validate(_validationSettings); 
     } 
     catch (ODataException ex) 
     { 
      return BadRequest(ex.Message); 
     } 

     IEnumerable<HighSchoolViewModel> returnData = await _service.ODataSearchAsync(propertyId, odataOptions); 
     return Ok<IEnumerable<HighSchoolViewModel>>(returnData); 
    } 

а вот мой бизнес слой/метод

public async Task<IEnumerable<HighSchoolViewModel>> ODataSearchAsync(Guid propertyId, ODataQueryOptions<HighSchoolViewModel> queryOptions) 
     { 
      using (DbContext context = new LAMSContext()) 
      { 
       var query = queryOptions.ApplyTo(context.PropertyHighSchools.Where(hs => hs.PropertyId == propertyId) 
        .Project().To<HighSchoolViewModel>()); 
       return await ((IQueryable<HighSchoolViewModel>)query).ToListAsync(); 
      } 
     } 

Это прекрасно работает все, кроме $ выбора (и, вероятно, расширяться, но это «выходит за рамки»).

Очевидно, что при запуске ApplyTo() он меняет IQueryable на возврат анонимного типа и там, где выполняется запрос, выполняется раздутие. Поэтому я попытался вернуть IEnumerable, поэтому тип не имеет значения, но когда я это делаю, OData не может справиться с этим и начинает выплевывать 406 ошибок.

ответ

0

В вашем сценарии изменить контроллер присущую форму ApiController и вернуть

result.AsQueryable(); 

Это может быть работа вокруг $select.

+0

Это ответ учебника, который, к сожалению, предполагает, что мой бизнес-уровень на самом деле является просто EF, и я непосредственно подключаюсь к нему в слое Web.API вместо слоя вниз в многоразовой бизнес-сборке. –

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