我有一個EF 6項目庫模式的方法。C# - IQueryable ToList異步 - EF6
private readonly DbContext _ctx = new SomeDbContext();
public IQueryable<TEntity> GetAll(bool noTracking = false)
{
return !noTracking ? _ctx.Set<TEntity>() : _ctx.Set<TEntity>().AsNoTracking();
}
在我的其他項目,這是業務相關的,不會有任何EntityFramework.dll參考,它只是訪問該存儲庫的項目,我做了我自己的ToListAsync擴展方法。
它採用T類型的對象的IQueryable的從存儲庫返回並異步將其轉化爲T的名單
public static async Task<IList<T>> ToListAsync<T>(this IQueryable<T> query)
{
return await new Task<IList<T>>(query.ToList);
}
用法:
await GetAll(true).Where(<some predicate>).ToListAsync();
的事情是,它只是不工作。當debbuger命中擴展方法並嘗試傳遞它時,它只是停止調試,沒有錯誤,沒有例外,它只是完全停止應用程序。
我試着改變Task的創建方式,但沒有進展。
這是怎麼發生的?
謝謝。
UPDATE:
Altough我已經改變了擴展方法,它顯然奏效,一個奇怪的現象仍然存在。
擴展方法只在斷點或不調用異步時執行,如果讓它自由運行,調試器/應用程序退出,它不執行進一步的代碼。
作品:
var x = repo.GetAll(true).ToListAsync().Result;
不工作(應用程序只是退出)
var x = await repo.GetAll(true).ToListAsync();
更新2:
所有這些測試都是在一個控制檯應用程序正在舉行,所以有必要以wait
作爲異步方法,否則會退出。
MethodX().Wait();
你爲什麼不在存儲庫中使用EF的異步方法? –
我將不得不將庫方法的返回類型從'IQueryable'更改爲'任務>'。在我的業務層,我希望能夠靈活地選擇何時在列表中轉換查詢,而不是總是返回列表。有時我只需要IQueryable。但我不知道什麼需要更多時間:查詢數據庫或在List中實現結果。 –
MurariAlex