从2.0 MongoDb c#驱动程序获取结果

时间:2015-04-02 16:07:13

标签: c# .net mongodb async-await mongodb-.net-driver

我已使用MongoDb的1.02.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

3 个答案:

答案 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;