如何将 AsQueryable 方法与 MongoDb C# Driver 2.1 异步使用?
How do I use the AsQueryable method asynchronously with MongoDb C# Driver 2.1?
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);
}
我想做类似的事情
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();
我up-voted接受的答案。
如果您需要从调用者那里抽象出 IMongoQueryable
接口,这个小扩展助手可能会有用。
public static class MongoQueryableMixIn
{
public static Task<List<T>> ToMongoListAsync<T>(this IQueryable<T> mongoQueryOnly)
{
return ((IMongoQueryable<T>) mongoQueryOnly).ToListAsync();
}
}
首先您必须为 IMonqoQuarable<T>
对象调用 ToCursorAsync()
,然后为等待的 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();
我稍后将发布此作为更新版本的 MongoDB 驱动程序的更新。
在 MongoDB 的较新版本中,您可以异步调用它。
您需要包括 MongoDB.Driver.Linq:
using MongoDB.Driver.Linq;
var myTypes = await Database.GetCollection<MyType>().AsQueryable()
.Where(t => t.Id == 1).ToListAsync();
正如 JohnnyHK 在接受的答案中提到的,return 类型不正确,应该是 IMongoQueryable<T>
,但是,这还不是全部。
要在 IMongoQueryable<T>
对象上执行 .ToListAsync(),您还需要包含命名空间 using MongoDB.Driver.Linq
。如果您的 IMongoQueryable<T>
接口提供程序与您要调用 .ToListAsync() 的位置位于同一个文件中,那么现在这是一个 no-brainer,但在我的例子中,基础 class 提供 IMongoQueryable<T>
接口,我想在派生的 class.
中使用它
我需要添加 using MongoDB.Driver.Linq
才能访问该扩展方法。
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);
}
我想做类似的事情
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();
我up-voted接受的答案。
如果您需要从调用者那里抽象出 IMongoQueryable
接口,这个小扩展助手可能会有用。
public static class MongoQueryableMixIn
{
public static Task<List<T>> ToMongoListAsync<T>(this IQueryable<T> mongoQueryOnly)
{
return ((IMongoQueryable<T>) mongoQueryOnly).ToListAsync();
}
}
首先您必须为 IMonqoQuarable<T>
对象调用 ToCursorAsync()
,然后为等待的 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();
我稍后将发布此作为更新版本的 MongoDB 驱动程序的更新。
在 MongoDB 的较新版本中,您可以异步调用它。 您需要包括 MongoDB.Driver.Linq:
using MongoDB.Driver.Linq;
var myTypes = await Database.GetCollection<MyType>().AsQueryable()
.Where(t => t.Id == 1).ToListAsync();
正如 JohnnyHK 在接受的答案中提到的,return 类型不正确,应该是 IMongoQueryable<T>
,但是,这还不是全部。
要在 IMongoQueryable<T>
对象上执行 .ToListAsync(),您还需要包含命名空间 using MongoDB.Driver.Linq
。如果您的 IMongoQueryable<T>
接口提供程序与您要调用 .ToListAsync() 的位置位于同一个文件中,那么现在这是一个 no-brainer,但在我的例子中,基础 class 提供 IMongoQueryable<T>
接口,我想在派生的 class.
我需要添加 using MongoDB.Driver.Linq
才能访问该扩展方法。