我使用官方C#驱动程序执行FindAll
并升级到新驱动程序2.0。 FindAll
已过时,将替换为Find。我正在尝试转换一个返回Class1
列表的简单方法。无法在文档中使用POCO找到一个真实的例子
var collection = database.GetCollection<ClassA>(Collection.MsgContentColName);
return collection.FindAll().ToList();
有人可以帮我转换2.0驱动程序并返回列表而不是任务吗?
答案 0 :(得分:43)
编辑:
他们决定添加回同步支持(尽管异步仍然是IO操作的首选)所以你可以简单地使用:
var list = collection.Find(_ => true).ToList();
原件:
不要在异步代码上同步阻塞。它对性能有害并可能导致死锁。
如果您希望保持应用程序同步,建议您继续使用旧的同步驱动程序。
在新的v2.0驱动程序中,async
选项应如下所示:
async Task FooAsync()
{
var list = await collection.Find(_ => true).ToListAsync();
}
答案 1 :(得分:2)
使用MongoDb 2.2.4版,实现稍有改变。 按照最佳实践,让我们构建MongoDb连接:
public static class PatientDb
{
public static IMongoCollection<Patient> Open()
{
var client = new MongoClient("mongodb://localhost");
var db = client.GetDatabase("PatientDb");
return db.GetCollection<Patient>("Patients");
}
}
现在返回IMongoCollection
的接口而不是像MongoCollection
这样的具体类的实例。无需再创建服务器实例来获取数据库,客户端可以直接访问数据库。
然后在控制器中这样完成:
public class PatientController : ApiController
{
private readonly IMongoCollection<Patient> _patients;
public PatientController()
{
_patients = PatientDb.Open();
}
public IEnumerable<Patient> Get()
{
return _patients.Find(new BsonDocument()).ToEnumerable();
}
}
其中_patients
是IMongoCollection并且要检索所有患者而不是使用FindAll()
现在使用Find()
,其中过滤器是BsonDocument
的新实例。< / p>
答案 2 :(得分:1)
这是使用MongoDb C#Driver 2.2
新的C#驱动程序是异步的。无论喜欢与否,都应该处理它。它将来会派上用场。但是现在......
在下面的代码中,由于代码&#34; result.GetAwaiter()。GetResult();&#34;,异步调用实际上是同步的。这使得异步代码在正常流程中执行到最终状态。
static void MongoGoNow()
{
IMongoCollection<ClassA> collection = db.GetCollection<ClassA>(Collection.MsgContentColName);
var result = TestFind(collection);
result.GetAwaiter().GetResult();
//What's next???
}
static async Task TestFind(IMongoCollection<ClassA> 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<ClassA> collection = db.GetCollection<ClassA>(Collection.MsgContentColName);
TestFind(collection).GetAwaiter().GetResult();
//What's next???
}
答案 3 :(得分:0)
要检索全部内容,可以按照documentation
使用空过滤器 FilterDefinition<T>.Empty
例如
public async Task<IEnumerable<ClassA>> GetAllAsync() =>
await database.GetCollection<ClassA>(Collection.MsgContentColName)
.Find(FilterDefinition<ClassA>.Empty).ToListAsync();
答案 4 :(得分:0)
这等同于FindAll(),
var list = await collection.Find(new BsonDocument()).ToListAsync();
答案 5 :(得分:-12)
你可以这样做来实现相同的使用2.0驱动程序,
var collection = database.GetCollection<ClassA>(Collection.MsgContentColName);
var doc = collection.Find(filter).ToListAsync();
doc.Wait();
return doc.Result;