2013-12-14 38 views
7

我一直在試圖進行以下控制方法異步製作一個Web API控制器返回的IQueryable列表異步

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

我已經添加了以下使它異步

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

的類型System.Data.Entity.DbSet不可等待

我不知道如何讓db上下文返回所有實體,同時保持IQueryable。

你如何使上述方法異步?感謝或幫助。

+1

我懷疑你可以這樣做,但異步功能僅適用於EF6以上,你使用的是EF6嗎? –

回答

6

這聽起來像你正在實施一個OData端點。如果您在此級別執行此操作(直接從您的控制器返回DbSet),則異步性質完全取決於WebAPI;你正在做的只是返回它可以同步或異步使用的一個IQueryable

沒有什麼可以做「異步」製作,而且沒有理由。

2

這是我找到了解決辦法:

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

它可以異步和應用過濾器。

+0

沒有理由這樣做。 IQueryable不是對數據庫的請求。如果你從Asp.net模板創建一個控制器,你會注意到他們沒有爲這個原因在Get()調用上設置一個異步。 – jsgoupil

+1

我想要的是當IQueryable被執行時,對數據庫的請求被異步執行,以便使用更少的線程。所以這是必要的。如果沒有上述技術,當線程命中DB時,線程將保持空閒狀態直到DB返回響應。 –

0

我有類似的問題,由於某種原因,我不能直接使用.ToListAsync(),VS也不允許我使用QueryableExtensions命名空間。最後,我決定執行整個代碼,如:

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