24

我是用官方的C#驱动做的FindAll,升级到新的驱动2.0。FindAll已过时并替换为 Find。我正在尝试转换一个简单的方法,该方法返回给我一个Class1. 在他们的文档中找不到使用 POCO 的实际示例

var collection = database.GetCollection<ClassA>(Collection.MsgContentColName); return collection.FindAll().ToList();

有人可以帮我转换 2.0 驱动程序并返回列表而不是任务吗?

4

6 回答 6

60

编辑:

他们决定添加回同步支持(尽管异步对于 IO 操作仍然更可取),因此您可以简单地使用:

var list = collection.Find(_ => true).ToList();

原来的:

不要在异步代码上同步阻塞。这对性能不利,并可能导致死锁。

如果您想保持应用程序同步,建议您继续使用旧的同步驱动程序。

在新的 v2.0 驱动程序中,该async选项应如下所示:

async Task FooAsync()
{
    var list = await collection.Find(_ => true).ToListAsync();
}
于 2015-04-17T23:31:43.217 回答
2

要检索所有内容,您可以根据文档使用空过滤器

FilterDefinition<T>.Empty

例如

    public async Task<IEnumerable<ClassA>> GetAllAsync() =>
                await database.GetCollection<ClassA>(Collection.MsgContentColName)
               .Find(FilterDefinition<ClassA>.Empty).ToListAsync();
于 2018-06-26T19:05:00.770 回答
2

在 MongoDb 2.2.4 版本中,实现发生了一些变化。遵循最佳实践,让我们像这样构建 MongoDb 连接:

public static class PatientDb
{
    public static IMongoCollection<Patient> Open()
    {
        var client = new MongoClient("mongodb://localhost");
        var db = client.GetDatabase("PatientDb");
        return db.GetCollection<Patient>("Patients");
    } 
}

现在返回一个接口IMongoCollection而不是一个具体类的实例,例如MongoCollection. 不再需要创建服务器实例来获取数据库,客户端可以直接访问数据库。

然后在控制器中是这样完成的:

public class PatientController : ApiController
{
    private readonly IMongoCollection<Patient> _patients;

    public PatientController()
    {
        _patients = PatientDb.Open();
    }
    public IEnumerable<Patient> Get()
    {
        return _patients.Find(new BsonDocument()).ToEnumerable();
    }
}

哪里_patients是 IMongoCollection 并检索所有患者而不是使用FindAll()nowFind()过滤器是BsonDocument.

于 2016-06-28T12:43:05.910 回答
1

这是使用 MongoDb C# Driver 2.2

新的 C# 驱动程序是异步的。不管喜欢与否,都应该处理。将来会派上用场。但现在...

在下面的代码中,异步调用实际上是同步的,因为代码“result.GetAwaiter().GetResult();”。这使得异步代码在正常流程中最终执行。

    static void MongoGoNow()
    {
        IMongoCollection<ClassA> collection = db.GetCollection<ClassA>(Collection.MsgContentColName);
        var result = TestFind(collection);
        result.GetAwaiter().GetResult();
        //What's next???
    }

    static async Task TestFind(IMongoCollection<ClassA> MyCollection)
    {
        var filter = new BsonDocument();
        var count = 0;
        using (var cursor = await MyCollection.FindAsync(filter))
        {
            while (await cursor.MoveNextAsync())
            {
                var batch = cursor.Current;
                foreach (var document in batch)
                {
                    // process document
                    count++;
                }
            }
        }       

您还可以合并 Main 方法中的最后两行代码,如下所示:

    static void MongoGoNow()
    {
        IMongoCollection<ClassA> collection = db.GetCollection<ClassA>(Collection.MsgContentColName);
        TestFind(collection).GetAwaiter().GetResult();
        //What's next???
    }
于 2015-12-12T09:00:28.113 回答
0

这将等效于 FindAll(),

var list = await collection.Find(new BsonDocument()).ToListAsync();
于 2019-04-11T14:01:39.773 回答
-18

您可以使用 2.0 驱动程序来达到同样的效果,

var collection = database.GetCollection<ClassA>(Collection.MsgContentColName);
var doc = collection.Find(filter).ToListAsync();
doc.Wait();
return doc.Result;
于 2015-04-17T21:43:40.120 回答