[英]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()
有没有更好的方法来收集所有文档?
这里有两个问题。
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();
}
不是现在。 您可以传入一个空的过滤器文档( new BsonDocument()
),但是我认为这没有什么更好。 在驱动程序的下一版本(v2.1)中,他们添加了一个空过滤器,因此您可以执行以下操作:
await database.GetCollection<Foo>("Foo").Find(Builders<Foo>.Filter.Empty)
在这里 ,它说你必须调用FindAsync一个空的过滤器返回所有文档的集合:
要返回集合中的所有文档,请使用空的过滤器文档调用FindAsync方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.