我已使用MongoDb的1.0和2.0 c#驱动程序构建了一个示例应用。
他们序列化相同的对象,我可以用两者写,并从1.0读取。但我无法在2.0中使用FindAsync
给我任何结果。
这是我的1.0查询,它返回一个文档:
var results = collection.AsQueryable<FlatCatalogItem>()
.FirstOrDefault(c => c.BatchId == "2015.01.27"
&& c.Upcs.Any(u => u.UPC == "123456803"));
使用与FindAsync
相同的数据的我的2.0查询如下所示:
var task = collection.FindAsync(item => item.BatchId == "2015.01.27"
&& item.Upcs.Any(u => u.UPC == "123456803"));
task.Wait();
var results = task.Result;
从结果返回的AsyncCursor
中没有任何内容。
results.MoveNextAsync().Wait(); // results.Current.Count = 0
这可能是我对异步和等待的无知,或者我可能错过了2.0查找方法的其他内容? 请注意,我不想使用legacy 2.0 drivers
答案 0 :(得分:9)
新API仅为async
- 您不应该阻止它。它不可扩展,可能导致死锁。始终使用async-await
或继续使用旧API。在async
方法中,查询应如下所示:
async Task Foo()
{
FlatCatalogItem first = await collection.
Find(c => c.BatchId == "2015.01.27" && c.Upcs.Any(u => u.UPC == "123456803")).
FirstOrDefaultAsync();
// use first
}
答案 1 :(得分:2)
你能试试吗?
var task = collection.Find(item => item.BatchId == "2015.01.27"
&& item.Upcs.Any(u => u.UPC == "123456803")).FirstOrDefaultAsync();
task.Wait();
var results = task.Result;
我也试图习惯新的API。
答案 2 :(得分:2)
或许更优雅一点:
var result = collection.Find(item => item.BatchId == "2015.01.27"
&& item.Upcs.Any(u => u.UPC == "123456803"))
.FirstOrDefaultAsync().Result;