如何将 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个问题。
- 如何将
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();
}
- 是否有更好的方法来收集所有文档?
现在还没有。您可以传入一个空的过滤器文档 (new BsonDocument()
),但我认为这并没有什么好处。在驱动程序的下一个版本 (v2.1) 中,他们添加了一个空过滤器,因此您可以这样做:
await database.GetCollection<Foo>("Foo").Find(Builders<Foo>.Filter.Empty)
我有一个带签名的存储库:
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个问题。
- 如何将
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();
}
- 是否有更好的方法来收集所有文档?
现在还没有。您可以传入一个空的过滤器文档 (new BsonDocument()
),但我认为这并没有什么好处。在驱动程序的下一个版本 (v2.1) 中,他们添加了一个空过滤器,因此您可以这样做:
await database.GetCollection<Foo>("Foo").Find(Builders<Foo>.Filter.Empty)