Я пытаюсь получить $ выберите часть 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 ошибок.
Это ответ учебника, который, к сожалению, предполагает, что мой бизнес-уровень на самом деле является просто EF, и я непосредственно подключаюсь к нему в слое Web.API вместо слоя вниз в многоразовой бизнес-сборке. –