MongoDb C#ドライバーのバージョン2.1のリリースでは、最近メソッドAsQueryable
が再導入されましたが、非同期で呼び出す方法を見つけるのに苦労しています。
Entity Frameworkでは、これはQueryableExtensions.ToListAsync
を使用して実現されますが、MongoDbを使用して同等のものを見つけることはできません。
したがって、次のようなリポジトリメソッドが与えられます。
public IQueryable<MyType> GetFiltered(Expression<Func<MyType, bool>> predicate)
{
return Database.GetCollection<MyType>(typeof(MyType).Name).AsQueryable().Where(predicate);
}
私は次のようなことをしたかった
var myTypes = await MyRepository.GetFiltered(t => t.Id == 1).ToListAsync();
これは可能ですか?
GetFiltered
関数から間違った型を返しています。 IMongoQueryable<MyType>
ではなくIQueryable<MyType>
を返す必要があります。
public IMongoQueryable<MyType> GetFiltered(Expression<Func<MyType, bool>> predicate)
{
return Database.GetCollection<MyType>(typeof(MyType).Name).AsQueryable()
.Where(predicate);
}
その後、次のように正常に呼び出すことができます。
var myTypes = await MyRepository.GetFiltered(t => t.Id == 1).ToListAsync();
私は受け入れられた答えに賛成票を投じました。
呼び出し元からIMongoQueryable
インターフェイスを抽象化する必要がある場合は、この小さな拡張ヘルパーが役立つ場合があります。
public static class MongoQueryableMixIn
{
public static Task<List<T>> ToMongoListAsync<T>(this IQueryable<T> mongoQueryOnly)
{
return ((IMongoQueryable<T>) mongoQueryOnly).ToListAsync();
}
}
最初に、_IMonqoQuarable<T>
_オブジェクトに対してToCursorAsync()
を呼び出し、次に、待機中のIAsyncCursor結果に対してToListAsync()
を呼び出す必要があります。
_public IMongoQueryable<MyType> GetFiltered(Expression<Func<MyType, bool>> predicate)
{
return Database.GetCollection<MyType>(typeof(MyType).Name).AsQueryable()
.Where(predicate);
}
_
その後
_var myTypes = await(await MyRepository.GetFiltered(t => t.Id == 1).ToCursorAsync()).ToListAsync();
_