还有其他类似的问题,但据我所知与实际的 FindAsync 无关。
我的 ClientsController
调用 ClientService.GetClients
,它使用 mongo 驱动程序查询 Azure 上的 mongodb。
单步执行调试器,直到我调用clientCollection.FindAsync
。如果我跨过此行,则永远不会命中下面的行,并且不会给出任何错误。就像等待的任务永远不会返回一样。
public async Task<List<Client>> GetClients(SearchRequestDTO searchRequest)
{
var response = new List<Client>();
var db = _databaseUtilityService.GetCoreDatabase();
var clientCollection = db.GetCollection<Client>(Properties.Settings.Default.ClientCollectionName);
var cursor = await clientCollection.FindAsync(new BsonDocument());
while (await cursor.MoveNextAsync())
{
response.Concat(cursor.Current.ToList());
}
return response;
}
调试器从不跨过 varcursor = ...
行的原因是什么?
编辑-
我可以得到结果
-
var 光标 = clientCollection.FindAsync(new BsonDocument()).Result;
但我不确定这就是我想要做的。
public async Task<List<Client>> GetClients(SearchRequestDTO searchRequest)
{
var db = _databaseUtilityService.GetCoreDatabase();
var clientCollection = db.GetCollection<Client>(Properties.Settings.Default.ClientCollectionName);
var results = clientCollection.FindAsync(new BsonDocument()).Result;
return results.ToList();
}
最佳答案
由于没有太多关于上下文的信息,所以我想出了模拟类来满足问题。
请参阅下面的重载方法,当调用时,它将始终返回包含三个记录的列表。现在你的代码有什么问题吗?我相信它在你的 while 循环中。您正在调用导致问题的 response.Concat
。
我改为调用 response.AddRange
并且它有效。
public async Task<List<Client>> GetClients()
{
var mongoUri = "mongodb://localhost:27017";
var mongoClient = new MongoClient(mongoUri);
var mongoDatabase = mongoClient.GetDatabase("ClientDB");
var clientCollection = mongoDatabase.GetCollection<Client>("Clients");
// Empty collection to always get accurate result.
clientCollection.DeleteMany(new BsonDocument());
// Insert some dummy data
clientCollection.InsertOne(new Client() {Address = "One street, some state", ZipCode = 11111});
clientCollection.InsertOne(new Client() { Address = "2nd street, some state", ZipCode = 22222 });
clientCollection.InsertOne(new Client() { Address = "Third street, some state", ZipCode = 33333 });
var response = new List<Client>();
var cursor = await clientCollection.FindAsync(new BsonDocument());
while (await cursor.MoveNextAsync())
{
response.AddRange(cursor.Current);
}
return response;
}
关于C# MongoDB FindAsync 永远不会返回 Await,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41794435/