web-dev-qa-db-ja.com

AsQueryableメソッドをMongoDbC#Driver 2.1と非同期で使用するにはどうすればよいですか?

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();

これは可能ですか?

23
rrrr

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();
29
JohnnyHK

私は受け入れられた答えに賛成票を投じました。

呼び出し元からIMongoQueryableインターフェイスを抽象化する必要がある場合は、この小さな拡張ヘルパーが役立つ場合があります。

public static class MongoQueryableMixIn
{
    public static Task<List<T>> ToMongoListAsync<T>(this IQueryable<T> mongoQueryOnly)
    {
        return ((IMongoQueryable<T>) mongoQueryOnly).ToListAsync();
    }
}
2
Dave Jellison

最初に、_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();
_
0
Tselofan