【发布时间】:2015-08-18 09:10:26
【问题描述】:
我正在尝试让 ODataQueryOptions 的 $select 部分与我的业务层一起使用,但我似乎无法解决问题(仅供参考:将 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();
}
}
这适用于除 $select 之外的所有内容(可能是扩展,但这是“超出范围”)。
显然,当 ApplyTo() 运行时,它会将 IQueryable 更改为返回匿名类型,并且在执行查询时会崩溃。所以我尝试返回一个 IEnumerable,这样类型就无关紧要了,但是当我这样做时,OData 似乎无法处理它并开始吐出 406 错误。
【问题讨论】: