如何在新的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
例如
上述就是C#学习教程:如何在新的mongo C#驱动程序中执行findAll并使其同步分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
public async Task> GetAllAsync() => await database.GetCollection(Collection.MsgContentColName) .Find(FilterDefinition .Empty).ToListAsync();
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/949316.html