簡體   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