【问题标题】:Getting results from 2.0 MongoDb c# driver从 2.0 MongoDb c# 驱动程序获取结果
【发布时间】:2015-06-07 16:14:28
【问题描述】:

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

它们序列化相同的对象,我可以同时使用这两个对象进行写入并从 1.0.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"));

我的 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;

从 result 返回的AsyncCursor 中没有任何内容。

results.MoveNextAsync().Wait(); // results.Current.Count = 0

这可能是我对 async 和 await 的无知,或者我可能错过了 2.0 find 方法的其他内容? 请注意,我不想使用legacy 2.0 drivers

【问题讨论】:

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


    【解决方案1】:

    你能试试这个吗?

    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】:

    新的 API 是 async-only,你不应该阻止它。它不可扩展,可能会导致死锁。一直使用 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
    }
    

    【讨论】:

    • 知道为什么他们有 FindAsync 和 Find 方法吗?两者都有 FirstOrDefaultAsync 方法。
    • @runxc1BretFerrier 不同之处在于返回值FindAsync 返回IAsyncCursor,而Find 返回IFindFluentIFindFluent 使您能够在实际执行搜索之前进一步定义搜索(例如添加投影或排序)。 FindAsync 立即执行查询并返回一个游标。您可以使用ToCursorAsyncIFindFluent 获取光标。
    【解决方案3】:

    或者更优雅一点:

    var result = collection.Find(item => item.BatchId == "2015.01.27" 
                                      && item.Upcs.Any(u => u.UPC == "123456803"))
                           .FirstOrDefaultAsync().Result;
    

    【讨论】:

    • er 这不是在异步操作完成之前返回结果吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2015-08-21
    相关资源
    最近更新 更多