2015-04-17 6 views
19

मैं आधिकारिक सी # चालक उपयोग कर रहा था एक FindAll करते हैं और नया ड्राइवर 2.0 में अपग्रेड करने के लिए बनाने के लिए। FindAll अप्रचलित है और इसे ढूंढने के साथ बदल दिया गया है। मैं एक सरल विधि है कि मुझे Class1 की सूची लौटाता है परिवर्तित करने के लिए कोशिश कर रहा हूँ। नहीं कर सकते एक यथार्थवादी उदाहरण उनके दस्तावेज में एक POCO का उपयोग कर पाते हैंनई मोंगो सी # चालक में findAll करते हैं और इसे तुल्यकालिक

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

किसी कृपया मुझे 2.0 ड्राइवर के साथ बदलने और वापसी एक सूची और न किसी कार्य में मदद कर सकते हैं?

उत्तर

-7

आप ऐसा कर सकता है 2.0 ड्राइवर का उपयोग कर एक ही प्राप्त करने के लिए,

var collection = database.GetCollection<ClassA>(Collection.MsgContentColName); 
var doc = collection.Find(filter).ToListAsync(); 
doc.Wait(); 
return doc.Result; 
+1

फ़िल्टर क्या है? यह कहीं भी परिभाषित या समझाया नहीं गया है। यह प्रश्न को संबोधित नहीं करता है और इसमें अस्पष्ट/अपरिभाषित कोड शामिल है। पोस्टर एक FindAll चाहता है। –

+1

फ़िल्टर आपकी फ़िल्टर परिभाषा है और यदि आपके पास कोई नहीं है तो बस "नया BsonDocument()" का उपयोग करें। ओपी ने उस स्पष्टीकरण के लिए नहीं पूछा था, इसलिए सोचा कि उसने इसे समझ लिया था। – XtremeBytes

+0

फ़िल्टर को "{}" पर सेट करें, जो सभी को वापस कर देगा, हालांकि सबसे अच्छा नहीं है। – MiloTheGreat

29

संपादित करें:

वे वापस तुल्यकालिक समर्थन जोड़ने के लिए (हालांकि async अभी भी आईओ के संचालन के लिए पसंद किया जाता है) तो आप बस कर सकते हैं का फैसला किया उपयोग:

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

मूल:

SYNCHRON ब्लॉक न करें असीमित कोड पर। प्रदर्शन के लिए यह बुरा है और डेडलॉक्स का कारण बन सकता है।

आप यह अनुशंसित है कि आप पुराने तुल्यकालिक ड्राइवर का उपयोग करते रहने तुल्यकालिक आपके आवेदन को रखना चाहते हैं।

नई v2.0 चालक async विकल्प इस तरह दिखना चाहिए में:

async Task FooAsync() 
{ 
    var list = await collection.Find(_ => true).ToListAsync(); 
} 
+0

जानकारी के लिए धन्यवाद। हालांकि अगर मैं एक कार्य वापस करता हूं तो वह कॉलिंग विधियों के साथ भी प्रचार नहीं करेगा। मेरा मतलब है, मुझे अपने सभी तरीकों को सही तरीके से बनाना होगा? – Kar

+1

@ कर हाँ, आप करेंगे। 'Async-await' का उपयोग करने का यह एक आम परिणाम है। यह जितना संभव हो उतना ऊंचा होना चाहिए। अन्यथा मैं पुराने एपीआई (जो अभी भी 'async' अनुरोधों पर अवरुद्ध है) का उपयोग कर या नवीनतम v1.9 संस्करण का उपयोग करने का सुझाव देगा जो पूरी तरह सिंक्रोनस है। – i3arnon

+2

"* डेडलॉक्स का कारण बन सकता है *" ऐसा नहीं होना चाहिए क्योंकि मोंगोडीबी 2.0 चालक 'कार्य' पर 'कॉन्फ़िगरएवाइट (झूठी)' को कॉल करके प्रतीक्षा कर रहा है। – tugberk

0

यह MongoDB सी # चालक 2.2

नई सी # चालक अतुल्यकालिक है के साथ है। इसकी तरह या नहीं, इसे निपटाया जाना चाहिए। यह भविष्य में काम में आ जाएगा। लेकिन अभी के लिए ...

एसिंक्रोनस कॉल के नीचे दिए गए कोड में कोड "परिणाम.गेटवाइटर()। 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++; 
       } 
      } 
     }  

तुम भी इस प्रकार मुख्य विधि में कोड की अंतिम दो पंक्तियों मर्ज कर सकते हैं:

static void MongoGoNow() 
    { 
     IMongoCollection<ClassA> collection = db.GetCollection<ClassA>(Collection.MsgContentColName); 
     TestFind(collection).GetAwaiter().GetResult(); 
     //What's next??? 
    } 
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() अब Find() प्रयोग किया जाता है जहां फिल्टर BsonDocument का एक नया उदाहरण है का उपयोग करने के बजाय सभी मरीजों को पुनः प्राप्त करने के।

संबंधित मुद्दे