2015-04-23 31 views
0

我正在嘗試使用MongoDB的C#驅動程序2.0進行練習。我不知道C#,所以我在Visual Basic中編寫代碼。Mongodb驅動程序2.0在VB.net中查找()不起作用

當我嘗試打印出列表代碼不會編譯。我知道我已將For Each內容註釋掉了,但這不是問題。我想查詢集合中所有文檔的數據庫,並將它們打印到文本框中。

下面是不工作的代碼。最後一部分給了我麻煩。

Private Sub btnListUsers_Click(sender As Object, e As EventArgs) Handles btnListUsers.Click 

    Dim ConnString As String 
    ConnString = txtConnStr.Text 

    Dim vDbName As String 
    vDbName = txtDb.Text 

    Dim vColName As String 
    vColName = txtColl.Text 

    Dim vClient As MongoClient 

    vClient = DbConnection(ConnString, vDbName, vColName) 

    Dim vDb As MongoDatabaseBase 
    vDb = vClient.GetDatabase(vDbName) 

    Dim vCol As IMongoCollection(Of BsonDocument) 
    vCol = vDb.GetCollection(Of BsonDocument)(vColName) 

    Dim query As BsonDocument 
    query = New BsonDocument("Names", txtListUsers.Text) 

    For Each item As BsonDocument In vCol.Find(query).ToListAsync() 
     'print a count 
     'print bson document 

    Next 

End Sub 

任何幫助表示讚賞。幾個小時以來,我一直在敲擊鍵盤。

以下是爲我工作後ALEX給我一個答案的代碼:

Private Async Sub btnListUsers_Click(sender As Object, e As EventArgs) Handles btnListUsers.Click 

     Dim ConnString As String 
     ConnString = txtConnStr.Text 

     Dim vDbName As String 
     vDbName = txtDb.Text 

     Dim vColName As String 
     vColName = txtColl.Text 

     Dim vClient As MongoClient 

     vClient = DbConnection(ConnString, vDbName, vColName) 

     Dim vDb As MongoDatabaseBase 
     vDb = vClient.GetDatabase(vDbName) 

     Dim vCol As IMongoCollection(Of BsonDocument) 
     vCol = vDb.GetCollection(Of BsonDocument)(vColName) 

     Dim query As BsonDocument 
     query = New BsonDocument("Name", txtListUsers.Text) 

     Dim myList As List(Of BsonDocument) = Await vCol.Find(query).ToListAsync() 

     Dim i As Integer = 0 

     For Each vItem As BsonDocument In myList 

      'count 
      i += 1 

      'print bson document 
      rtfDataDisplay.Text = rtfDataDisplay.Text & vbCrLf & "#" & i.ToString & " - " & vItem.ToString & vbCrLf 

     Next 

    End Sub 

我不得不異步添加到子。我也有我的關鍵「名稱」不正確。之後,事情進展順利。嗚呼!

+0

您編寫的代碼不會編譯,但您不包括編譯器在您的問題中產生的錯誤消息。你不認爲這可能有助於人們閱讀這個問題嗎?請[編輯]您的問題並添加此信息。順便說一句,ToListAsync()的返回類型是什麼?它是一個'foreach'可以用來枚舉的'IEnumerable'嗎? – Alex

+0

我沒有在我面前的錯誤。我離開那臺電腦。當我今晚回家時,我會將這些信息添加到問題中。 – Trewaters

+0

2.0驅動程序的所有方法都是異步的。 vCol.Find(query).ToListAsync()只會返回一個任務。您必須使用await或等待任務才能獲取實際列表,然後針對每個列表重複使用它。備用選項是使用vCol.Find(query).ForEach操作。你仍然需要等待這個taks。 – XtremeBytes

回答

0

您的問題是在這條線:

For Each item As BsonDocument In vCol.Find(query).ToListAsync() 

ToListAsync()方法的調用返回awaitable Task(Of List(Of BsonDocument)),即一個承諾,它將返回時,它已經完成它獲取可以列舉的清單。您需要Await它才能進入列表。如:

Dim myList As List(Of BsonDocument) = Await vCol.Find(query).ToListAsync() 
For Each item As BsonDocument in myList 
    'print a count 
    'print bson document 
Next  

由MongoDB的驅動器提供了一個替代的構建體,是利用其ForEachAsync方法,並用的λ代表一個參數提供它。

+0

我不認爲VB.net有「List 」我認爲它是「列表(BsonDocument)」 我試過了答案中提供的代碼,我得到的編譯錯誤 - '等待'只能當包含在用'Async'修飾符標記的方法或lambda表達式中時使用。 這篇文章是從原來的編輯,因爲我意外地按Enter鍵。 – Trewaters

+0

感謝您的建議,它與我的想法保持一致。 – Trewaters

+0

@Trewaters是的,修正了通用列表的c#-ism。事實上,異步/等待會延伸到整個呼叫鏈。如果不是這樣,那麼在使用異步操作時就沒有任何好處。 – Alex

相關問題