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

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();
    }
}

はIMongoCollectionであり、フィルターが の新しいインスタンスである場所で_patients使用する代わりに、すべての患者を取得するためにFindAll()now が使用されます。Find()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 メソッドの最後の 2 行のコードをマージすることもできます。

    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 に答える