2015-04-23 74 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

相关问题