3

我有一个带有签名的存储库:

public Task<IList<IFoo>> GetList()
{

}

如何将 mongoDb 集合转换为该接口?(MongoDb 驱动程序 2.0)

public Task<IList<IFoo>> GetList()
{
    Task<List<Foo>> foo = this.database.GetCollection<Foo>("Foo").Find(e => true).ToListAsync();

    return foo ; // ?? somehow cast Task<List<Foo>> to Task<IList<IFoo>>
}

另外,这段代码困扰着我

collection.Find(e => true).ToListAsync()

有没有更好的方法来收集所有文档?

4

2 回答 2

4

这里有2个问题。

  1. 你怎么Task<List<Foo>>投到Task<IList<IFoo>>

你不能,因为Task在.Net中不是协变的。您可以使用解包结果,await但它仍然无法正常工作,因为您无法将List<Foo>其转换为IList<IFoo>.

您可以做的是创建一个新的List<IFoo>并在移动它们时投射所有项目:

public async Task<IList<IFoo>> GetList()
{
    List<Foo> results = await database.GetCollection<Foo>("Foo").Find(_ => true).ToListAsync();
    return results.Cast<IFoo>().ToList();
}
  1. 有没有更好的方法来收集所有文档?

不是现在。您可以传入一个空的过滤器文档 ( new BsonDocument()),但我认为没有更好的办法。在驱动程序的下一个版本(v2.1)中,他们添加了一个空过滤器,因此您可以这样做:

await database.GetCollection<Foo>("Foo").Find(Builders<Foo>.Filter.Empty)
于 2015-05-26T12:03:49.997 回答
1

在这里它说您必须使用空过滤器调用 FindAsync 才能返回集合中的所有文档:

要返回集合中的所有文档,请使用空筛选器文档调用 FindAsync 方法

于 2015-05-26T09:21:41.400 回答