'Public 成员 'Find' 类型 'MongoCollectionImpl(Of BsonDocument)' 未找到。

'Public member 'Find' on type 'MongoCollectionImpl(Of BsonDocument)' not found.'

我正在尝试从 mongodb 集合中查找与给定 ID 匹配的特定用户。 Folliwng 是我的 VB.Net 代码。但是,我不断收到错误 'Public member 'Find' on type 'MongoCollectionImpl(Of BsonDocument)' not found.'

  Public Function GetCollectionByName(ByVal collectionName As String)
    Dim db As IMongoDatabase = DBcontext()
    Dim collection As IMongoCollection(Of BsonDocument)

    collection = db.GetCollection(Of BsonDocument)(collectionName)

    Return collection
  End Function


   Public Function GetUser(ByVal id As String)
    Dim filter = Builders(Of BsonDocument).Filter.Eq(Of String)("ID", id)
    Dim collection = GetCollectionByName("Users")
    Dim list = collection.Find(filter).ToList()`<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ERROR here

    Return list
   End Function

首先,您必须 Option Strict Off 才能使该代码编译。那很糟。您应该立即在项目属性中打开 Option Strict On 并解决它提出的所有问题。其中之一就是您的 GetCollectionByName 没有声明 return 类型。这意味着这里:

Dim list = collection.Find(filter).ToList()

那个 collection 变量是隐式类型 Object 并且你在调用那个 Find 方法时依赖于后期绑定,因为 Object class 没有这样的方法。因此,您无法从 Intellisense 获得任何帮助,如果您正确执行此操作,Intellisense 会告诉您哪些成员可用,哪些成员不可用。

无论如何,如果您确实阅读了您正在使用的类型的文档以查看它们有哪些成员,您仍然可以让它工作。 Here 是您在该 GetCollectionByName 方法中使用的接口的文档,我不了解您,但我没有看到那里列出任何 Find 方法。有一个 FindSync 方法,所以也许这就是您真正想要的。如果您有 Option Strict On 并且在每个地方都使用了正确的类型,Intellisense 会告诉您这一点。

您还应该在 IDE 选项中打开 Option Strict On,以便以后的所有项目都是 On

我查看了 Java 的 MongoCollectionImpl 的一些文档,那里似乎有一个 find 方法,但这并不一定意味着相同的方法是在 .NET 中可用,并且您不会直接使用 class。您正在使用 IMongoCollection 因此您应该只使用该接口的成员。基本上,您的代码需要看起来更像下面的 Option Strict On:

Public Function GetCollectionByName(ByVal collectionName As String) As IMongoCollection(Of BsonDocument)
    Dim db As IMongoDatabase = DBcontext()
    Dim collection As IMongoCollection(Of BsonDocument)

    collection = db.GetCollection(Of BsonDocument)(collectionName)

    Return collection
End Function

Public Function GetUser(ByVal id As String) As List(Of BsonDocument)
    Dim filter = Builders(Of BsonDocument).Filter.Eq(Of String)("ID", id)
    Dim collection = GetCollectionByName("Users")
    Dim list = collection.FindSync(filter).ToList()

    Return list
End Function

如果您想使用接口,您可能需要将 GetUser 方法声明为 IList(Of BsonDocument) 类型。您可能应该重命名该方法或也更改实现。如果方法是 return 列表,那么名称不应表明它 return 是单个项目。