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)
我对接受的答案投了赞成票。
如果您需要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)