我正在为我的应用程序OData控制器实现通用基本控制器。这个控制器的方法如下:
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public virtual async Task<IHttpActionResult> Get(ODataQueryOptions<TEntity> options)
{
var source = db.Set<TEntity>().Where(e => !e.IsDeleted);
var queryable = (IQueryable<TEntity>)options.ApplyTo(source);
var entities = await queryable.ToListAsync();
return Ok(entities);
}
此控制器操作完全正常,直到您尝试使用$ expand或$ select之类的内容,这实际上会修改实体本身。这是因为在应用ODataQueryOptions之后,我们无法确定我们是否还有IQueryable。
要解决此问题,我将演员阵容移至IQueryable:
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public virtual async Task<IHttpActionResult> Get(ODataQueryOptions<TEntity> options)
{
var source = db.Set<TEntity>().Where(e => !e.IsDeleted);
var queryable = options.ApplyTo(source);
var entities = await queryable.ToListAsync();
return Ok(entities);
}
现在,每次调用此控制器操作都会返回HTTP状态代码406(不可接受),无论我是否使用$ expand / $ select。
实体是一个List,当它传递给Ok()时,这可能是问题吗? ODataContentFormatter是否存在List问题?那么你应该如何归还这种结果?
答案 0 :(得分:0)
启用$ select和$ expand你应该返回可查询的内容,这样你就需要继续返回IQueryable。
你的行动应该是这样的
[Queryable]
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public virtual async Task<IHttpActionResult> Get(ODataQueryOptions<TEntity> options)
{
var source = db.Set<TEntity>().Where(e => !e.IsDeleted);
var queryable = options.ApplyTo(source);
var entities = await queryable.ToListAsync();
return Ok(entities);
}
要全局启用OData查询选项,请在启动时在HttpConfiguration类上调用EnableQuerySupport:
public static void Register(HttpConfiguration config)
{
// ...
config.EnableQuerySupport();
// ...
}
答案 1 :(得分:0)
确保您的创业中有以下内容:
$validator = Validator::make($request->all(), [
'email' => 'required|unique:users',
'password' => 'required'
]);