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

paq*_*mez 6 .net c# mongodb async-await mongodb-.net-driver

我已经使用1.02.0 c#驱动程序为MongoDb 构建了一个示例应用程序.

它们序列化相同的对象,我可以用两者写入并从1.0读取.但是我无法FindAsync在2.0中使用给我任何结果.

这是我的1.0查询,它返回一个文档:

var results = collection.AsQueryable<FlatCatalogItem>()
                        .FirstOrDefault(c => c.BatchId == "2015.01.27" 
                                            && c.Upcs.Any(u => u.UPC == "123456803"));
Run Code Online (Sandbox Code Playgroud)

我的2.0查询使用相同的数据,FindAsync如下所示:

var task = collection.FindAsync(item => item.BatchId == "2015.01.27" 
                                     && item.Upcs.Any(u => u.UPC == "123456803"));
task.Wait();
var results = task.Result;
Run Code Online (Sandbox Code Playgroud)

AsyncCursor是从返回结果有什么也没有.

results.MoveNextAsync().Wait(); // results.Current.Count = 0
Run Code Online (Sandbox Code Playgroud)

这可能是我对异步和等待的无知,或者我可能错过了2.0查找方法的其他东西?请注意,我不想使用旧版2.0驱动程序

i3a*_*non 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
}
Run Code Online (Sandbox Code Playgroud)

  • @ runxc1BretFerrier不同之处在于返回值`FindAsync`返回`IAsyncCursor`而`Find`返回`IFindFluent`.`IFindFluent`使您能够在实际执行之前进一步定义搜索(例如添加投影或排序).`FindAsync`立即执行查询并返回一个游标.您可以使用`ToCursorAsync`从`IFindFluent`获取光标. (3认同)