create - ¿Cómo uso el método AsQueryable de forma asincrónica con MongoDb C#Driver 2.1?
mongodb net dll (3)
El lanzamiento de la versión 2.1 del MongoDb C # Driver ha reintroducido recientemente el método AsQueryable
, pero estoy luchando para encontrar una forma de llamarlo de forma asíncrona.
Con Entity Framework esto se lograría usando QueryableExtensions.ToListAsync
pero no puedo ver un equivalente usando MongoDb.
Así que dado un método de repositorio como:
public IQueryable<MyType> GetFiltered(Expression<Func<MyType, bool>> predicate)
{
return Database.GetCollection<MyType>(typeof(MyType).Name).AsQueryable().Where(predicate);
}
Queria hacer algo asi
var myTypes = await MyRepository.GetFiltered(t => t.Id == 1).ToListAsync();
es posible?
Al principio, debe llamar a ToCursorAsync()
para IMonqoQuarable<T>
, y luego llamar a ToListAsync()
para obtener el resultado esperado de IAsyncCursor:
public IMongoQueryable<MyType> GetFiltered(Expression<Func<MyType, bool>> predicate)
{
return Database.GetCollection<MyType>(typeof(MyType).Name).AsQueryable()
.Where(predicate);
}
Y entonces
var myTypes = await(await MyRepository.GetFiltered(t => t.Id == 1).ToCursorAsync()).ToListAsync();
Está devolviendo el tipo incorrecto de la función GetFiltered
. Debe devolver un IMongoQueryable<MyType>
lugar de IQueryable<MyType>
:
public IMongoQueryable<MyType> GetFiltered(Expression<Func<MyType, bool>> predicate)
{
return Database.GetCollection<MyType>(typeof(MyType).Name).AsQueryable()
.Where(predicate);
}
Entonces puedes llamarlo con éxito como:
var myTypes = await MyRepository.GetFiltered(t => t.Id == 1).ToListAsync();
Yo voté a favor de la respuesta aceptada.
Si necesita abstraer la interfaz IMongoQueryable
de la persona que llama, este pequeño ayudante de extensión puede ser útil.
public static class MongoQueryableMixIn
{
public static Task<List<T>> ToMongoListAsync<T>(this IQueryable<T> mongoQueryOnly)
{
return ((IMongoQueryable<T>) mongoQueryOnly).ToListAsync();
}
}