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

rrr*_*rrr 19 c# linq mongodb mongodb-.net-driver

MongoDb C#Driver版本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);
}
Run Code Online (Sandbox Code Playgroud)

我想做点什么

var myTypes = await MyRepository.GetFiltered(t => t.Id == 1).ToListAsync();
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Joh*_*yHK 24

你从GetFiltered函数返回了错误的类型.它应该返回一个IMongoQueryable<MyType>而不是IQueryable<MyType>:

public IMongoQueryable<MyType> GetFiltered(Expression<Func<MyType, bool>> predicate)
{
    return Database.GetCollection<MyType>(typeof(MyType).Name).AsQueryable()
        .Where(predicate);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以成功将其命名为:

var myTypes = await MyRepository.GetFiltered(t => t.Id == 1).ToListAsync();
Run Code Online (Sandbox Code Playgroud)


Ami*_*mir 16

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

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

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


Dav*_*son 6

我对接受的答案投了赞成票。

如果您需要IMongoQueryable从调用者那里抽象出接口,这个小扩展助手可能很有用。

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

  • 我刚刚意识到我没有在 MongoDB 中使用“AsQueryable”的异步方法,因为 .Where 返回 IQueryable。实体框架提供了“EntityFrameworkQueryableExtensions”类,其中包含类似的内容。 (3认同)
  • 有点惊讶这不是内置的。 (2认同)
  • 我刚刚发现有一个“Find”方法返回 IFindFluent,您可以使用它而不是 AsQueryable+Where (2认同)