如何与MongoDb C#Driver 2.1异步使用AsQueryable方法?

时间:2015-12-02 12:07:53

标签: c# mongodb linq mongodb-.net-driver

MongoDb C#Driver版本2.1的发布最近重新引入了方法AsQueryable,但我正在努力寻找一种异步调用它的方法。

使用实体框架,这可以使用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();

这可能吗?

4 个答案:

答案 0 :(得分:19)

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

答案 1 :(得分:1)

我对已接受的答案进行了投票。

如果你需要从调用者中抽象出IMongoQueryable接口,这个小扩展助手可能会有用。

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

答案 2 :(得分:0)

首先,您必须为ToCursorAsync()对象调用IMonqoQuarable<T>,然后为等待的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();

答案 3 :(得分:0)

我稍后将发布此内容作为更新版本的 MongoDB 驱动程序的更新。

在较新版本的 MongoDB 中,您可以异步调用它。 您需要包含 MongoDB.Driver.Linq:

using MongoDB.Driver.Linq;
var myTypes = await Database.GetCollection<MyType>().AsQueryable()
.Where(t => t.Id == 1).ToListAsync();