繁体   English   中英

如何将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()

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

这里有两个问题。

  1. 如何将Task<List<Foo>> Task<IList<IFoo>>Task<IList<IFoo>>

您不能,因为Task在.Net中不是协变的。 您可以使用await来解开结果,但是由于无法将List<Foo> IList<IFoo>转换为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)

在这里 ,它说你必须调用FindAsync一个空的过滤器返回所有文档的集合:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM