私はリポジトリパターンのアプローチでEF 6プロジェクトを持っています。私の他のプロジェクトでC# - IQueryable to 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が拡張メソッドにヒットし、それを渡そうとすると、デバッグが停止します。エラーも例外もなく、アプリケーションを完全に停止します。
タスクの作成方法を変更しようとしましたが、進捗はありません。
どうしてですか?
ありがとうございました。
UPDATE:
私は、拡張メソッドを変更しましたし、それは明らかに働いた、奇妙な行動がまだそこにあるAltough。
エクステンションメソッドはブレークポイントまたは非同期呼び出し時にのみ実行され、自由に実行できる場合はデバッガ/アプリケーションが終了し、それ以上のコードは実行されません。
作品:、
すべてのこれらのテストは、コンソールアプリケーションで開催されました:
var x = repo.GetAll(true).ToListAsync().Result;
はない作品(アプリケーションだけで終了します)
var x = await repo.GetAll(true).ToListAsync();
UPDATE 2い非同期メソッドwait
に必要です。そうでない場合は、終了します。
MethodX().Wait();
なぜリポジトリ内でEFの非同期メソッドを使用しないのですか? –
リポジトリメソッドの戻り値の型を 'IQueryable'から 'Task >'に変更する必要があります。私のビジネスレイヤーでは、いつリストを返すのではなく、いつリストをクエリに変換するかを選択する柔軟性が必要です。時にはIQueryableだけが必要な場合もあります。しかし、私は何がもっと時間がかかるか分からない:データベースに問い合わせるか、リストで結果を具体化する。 –
MurariAlex