[英]How do I use the AsQueryable method asynchronously with MongoDb C# 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();
这可能吗?
您从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();
}
}
起初,你必须调用ToCursorAsync()
为IMonqoQuarable<T>
对象,然后调用ToListAsync()
为等待IAsyncCursor结果:
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();
我稍后会将此作为更新版本的 MongoDB 驱动程序的更新发布。
在较新版本的 MongoDB 中,您可以异步调用它。 您需要包含 MongoDB.Driver.Linq:
using MongoDB.Driver.Linq;
var myTypes = await Database.GetCollection<MyType>().AsQueryable()
.Where(t => t.Id == 1).ToListAsync();
正如 JohnnyHK 在接受的答案中提到的那样,返回类型不正确,应该是IMongoQueryable<T>
,但是,这并不是所需要的全部。
要在IMongoQueryable<T>
object 上执行.ToListAsync(),您还需要using MongoDB.Driver.Linq
包含命名空间。 现在,如果您的IMongoQueryable<T>
接口提供程序与您要调用 .ToListAsync() 的位置位于同一个文件中,那么这很简单,但在我的例子中,基础 class 提供了IMongoQueryable<T>
接口,我想在我派生的 class 中使用它。
我需要添加using MongoDB.Driver.Linq
才能访问该扩展方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.