如何在新的mongo C#驱动程序中执行findAll并使其同步

我正在使用官方C#驱动程序来执行FindAll并升级到新的驱动程序2.0。 FindAll已过时,将替换为Find。 我试图转换一个简单的方法,返回一个Class1列表。 无法在文档中找到使用POCO的实际示例

var collection = database.GetCollection(Collection.MsgContentColName); return collection.FindAll().ToList();

有人可以帮我转换2.0驱动程序并返回列表而不是任务吗?

你可以这样做来实现相同的使用2.0驱动程序,

 var collection = database.GetCollection(Collection.MsgContentColName); var doc = collection.Find(filter).ToListAsync(); doc.Wait(); return doc.Result; 

编辑:

他们决定添加回同步支持(尽管异步仍然是IO操作的首选),因此您可以简单地使用:

 var list = collection.Find(_ => true).ToList(); 

原版的:

不要在异步代码上同步阻塞。 这对性能有害并可能导致死锁。

如果要保持应用程序同步,建议您继续使用旧的同步驱动程序。

在新的v2.0驱动程序中, async选项应如下所示:

 async Task FooAsync() { var list = await collection.Find(_ => true).ToListAsync(); } 

使用MongoDb 2.2.4版,实现稍有改变。 按照最佳实践,让我们构建MongoDb连接,如下所示:

 public static class PatientDb { public static IMongoCollection Open() { var client = new MongoClient("mongodb://localhost"); var db = client.GetDatabase("PatientDb"); return db.GetCollection("Patients"); } } 

现在返回一个IMongoCollection的接口,而不是像MongoCollection这样的具体类的实例。 无需再创建服务器实例来获取数据库,客户端可以直接访问数据库。

然后在控制器中完成如下:

 public class PatientController : ApiController { private readonly IMongoCollection _patients; public PatientController() { _patients = PatientDb.Open(); } public IEnumerable Get() { return _patients.Find(new BsonDocument()).ToEnumerable(); } } 

其中_patients是IMongoCollection并且检索所有患者而不是使用FindAll()现在使用Find() ,其中filter是BsonDocument的新实例。

这是MongoDb C#Driver 2.2

新的C#驱动程序是异步的。 是否喜欢它应该被处理。 它将来会派上用场。 但现在…

在下面的代码中,由于代码“result.GetAwaiter()。GetResult();”,异步调用实际上是同步的。 这使得异步代码在正常流程中执行到最终状态。

  static void MongoGoNow() { IMongoCollection collection = db.GetCollection(Collection.MsgContentColName); var result = TestFind(collection); result.GetAwaiter().GetResult(); //What's next??? } static async Task TestFind(IMongoCollection MyCollection) { var filter = new BsonDocument(); var count = 0; using (var cursor = await MyCollection.FindAsync(filter)) { while (await cursor.MoveNextAsync()) { var batch = cursor.Current; foreach (var document in batch) { // process document count++; } } } 

您还可以在Main方法中合并最后两行代码,如下所示:

  static void MongoGoNow() { IMongoCollection collection = db.GetCollection(Collection.MsgContentColName); TestFind(collection).GetAwaiter().GetResult(); //What's next??? } 

要检索所有内容,您可以根据文档使用空filter

FilterDefinition.Empty

例如

  public async Task> GetAllAsync() => await database.GetCollection(Collection.MsgContentColName) .Find(FilterDefinition.Empty).ToListAsync();