如何将 mongo 集合转换为接口 C#

How to cast mongo collection to interface C#

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

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()

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

Here 它说您必须使用空过滤器调用 FindAsync 以 return 集合中的所有文档:

To return all documents in a collection, call the FindAsync method with an empty filter document

这里有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)