私はEntity Framework Coreを使用してIQueryableを作成しています。 私は結果を一度に1ページ(一度に10件の結果)とするが、これをIEnumerable(またはIObservableのようなもの)として公開する方法を見つけたい。私はまた、これができるだけメモリ効率的であることを保証したい、つまりページサイズが10であれば、一度にメモリに座っているエンティティは10個だけです。最後に、データベース呼び出しを非同期にすることが必要です。これがこれを難しくしています。バッチでIQueryableを列挙します。
ここで「ToPagingEnumerableは」私が別のライブラリから作成または使用する方法であるいくつかの擬似コード、です:
IQueryable<T> query = dbContext.SomeTable;
IEnumerable<T> results = query.ToPagingEnumerable(pageSize: 10);
ConvertAndSaveResults(results);
そして、ここで「あなたができるので、動作しません迅速に失敗した、ですが、 T「非同期」と「利回り」コンバイン:
public static IEnumerable<TSource> ToPagingEnumerable<TSource>(
this IQueryable<TSource> source,
int size)
{
var skip = 0;
var cached = await source.Take(size).ToListAsync();
while (cached.Any())
{
foreach (var item in cached)
{
yield return item;
}
skip += cached.Count;
cached = await source.Skip(skip).Take(size).ToListAsync();
}
}
を私は簡単に反応小川(https://github.com/reactive-streams/reactive-streams-dotnet)を見て、これは私が達成したいものに似ているようです。
もう1つの選択肢は、Rx(Reactive)を使用して、IQueryableから結果の1ページ(たとえば10行)を取得し、サブスクライバにフィードし、別のページ(別の10行)それらを加入者に供給する。
私の目標を達成するためにこれらのライブラリを使用する方法を知っているか、より簡単かどうかを知るために、これらのライブラリのいずれかについて十分に知りません。
は、この答えはすべてであなたを助けていますか? https://stackoverflow.com/questions/40995248/asynchronous-paging-with-entity-framework-6-1-3 –
*データベースコールを非同期にすることはできますが、1つのコンテキストからのIQueryableを使用しますこれらの呼び出しを並行して実行することはできません。 –