使Web API控制器异步返回IQueryable列表

时间:2013-12-14 14:20:43

标签: c# .net web-services asynchronous asp.net-web-api

我一直在努力使以下控制器方法异步

public IQueryable<Category> GetCategories()
{
    return _context.Categories;
}

我添加了以下内容以使其异步

public async Task<IQueryable<Category>> GetCategories()
{
    return await _context.Categories;
}

类型System.Data.Entity.DbSet不可等待

我不确定如何在保持IQueryable的同时让db上下文返回所有实体。

如何使上述方法异步?谢谢或帮助。

3 个答案:

答案 0 :(得分:6)

听起来您正在实施OData端点。如果您在此级别执行此操作(直接从控制器返回DbSet),则异步性质完全取决于WebAPI;你正在做的只是返回IQueryable它可以同步或异步使用。

没有什么可以做到“使”它异步,并且没有理由。

答案 1 :(得分:3)

这是我找到的解决方案:

public async Task<IEnumerable<Category>> Get(ODataQueryOptions<Category> options)
{
     var myQueryable = (IQueryable<Category>)options.ApplyTo(context.Categories);   
     return await myQueryable.ToListAsync();
}

它工作异步并应用过滤器。

答案 2 :(得分:0)

我有类似的问题,由于某些原因我不能直接使用.ToListAsync(),VS也不允许我使用QueryableExtensions命名空间。最后,我决定实现整个代码:

var categories = await System.Data.Entity.QueryableExtensions.ToListAsync(context.Categories.Where(c => c.Name != "On Sale"));