【问题标题】:Unable to cast object of type MongoDB.Bson.ObjectId to type MongoDB.Bson.BsonValue无法将 MongoDB.Bson.ObjectId 类型的对象转换为 MongoDB.Bson.BsonValue 类型
【发布时间】:2021-12-01 01:24:02
【问题描述】:

全部:

我有一个名为 ObjectsList 的 IEnumerable,它基本上包含一堆 MongoDB.Bson.ObjectId 对象。我需要将整个名为 ObjectsList 的 IEnumerable 转换为名为 BsonValueList 的 IEnumerable

           IEnumerable<Object> ObjectsList =     DBConnection.database.GetCollection<ELLCsLog>("FMS_TM_MST_Logs")
                            .FindOneByIdAs<ELLCsInterfaceLog>(ObjectId.Parse(logIdArg.ToString())).logEventsIdList;

           IEnumerable<BsonValue> BsonValueList = ObjectsList.Cast<BsonValue>();

不幸的是,转换给出了以下错误:

Unable to cast object of type MongoDB.Bson.ObjectId to type     MongoDB.Bson.BsonValue  System.SystemException {System.InvalidCastException}

有人可以显示将转换上述 IEnumerable 的正确代码吗?

【问题讨论】:

    标签: c# mongodb casting bson objectid


    【解决方案1】:

    一般来说,如果你想将 ObjectIds 列表强制转换为 BsonValues,你需要像这样进行项目和显式强制转换:

    ObjectsList.Select(v => (BsonValue)v).ToList();
    

    我相信这是由于in the answers to this question解释的原因。

    在您有一个对象列表而不是 ObjectIds 的情况下,我发现您需要对 ObjectId 进行额外的强制转换 - 否则您会遇到与您尝试过的代码相同的错误。

    ObjectsList.Select(v => (BsonValue)(ObjectId)v).ToList();
    

    【讨论】:

    • 谢谢。我是 MongoDB 的新手。你能告诉我 MongoDB.Bson.ObjectId 和 MongoDB.Bson.BsonValue 之间的区别吗?此外,MongoDB.Bson.ObjectId 和 MongoDB.Bson.BsonValue 与典型 MongoDB 集合中的 _id 有何关系?
    • BSON 是 MongoDB 的序列化格式。 ObjectId 是一个 BsonType。其他 BsonTypes 包括 Double、String 等。BsonValue 是一个抽象类,可以是 BsonDocument 中的值。 BsonObjectId 是 BsonValue 的非抽象子类,其 Value 的类型为 ObjectId。 BSONValue 的其他子类包括 BsonDouble、BsonString,但您通常使用 .NET 类型 ObjectId、double、string。较低级别的序列化代码适用于 BsonValues。
    • 如果不指定,_id 字段将自动创建,但您可以在 POCO 上使用 [BsonId] 属性或命名字段 Id 指定一个。它不必是 ObjectId。
    【解决方案2】:

    我在迁移到 .net 核心后出现此错误。旧项目using Newtonsoft.Json 和新的.net 核心using System.Text.Json.Serialization。您可以使用其中一个或同时添加[JosnIgnore] 属性。

    [JsonIgnore]
    [System.Text.Json.Serialization.JsonIgnore] //add this one
    [BsonIgnoreIfNull]
    [BsonId]
    [Ignore]
    public BsonValue ID { get; set; }
    

    【讨论】:

    • 谢谢,它适用于某些情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    相关资源
    最近更新 更多