Невозможно привести объект типа MongoDB.Bson.ObjectId к типу MongoDB.Bson.BsonValue.

Все:

У меня есть IEnumerable с именем ObjectsList, который в основном содержит кучу объектов MongoDB.Bson.ObjectId. Мне нужно преобразовать весь IEnumerable с именем ObjectsList в IEnumerable с именем BsonValueList.

           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?


person CS Lewis    schedule 28.10.2015    source источник


Ответы (1)


В общем, если вы хотите привести список ObjectId к BsonValues, вам нужно сделать проект и явное приведение следующим образом:

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

Я считаю, что это связано с объясненными причинами в ответах на этот вопрос.

В вашем случае, когда у вас есть список объектов, а не ObjectId, я обнаружил, что вам нужно добавить дополнительное приведение к ObjectId, иначе вы получите ту же ошибку, что и с кодом, который вы пробовали.

ObjectsList.Select(v => (BsonValue)(ObjectId)v).ToList();
person sheilak    schedule 29.10.2015
comment
Спасибо. Я новичок в MongoDB. Не могли бы вы сказать мне разницу между MongoDB.Bson.ObjectId и MongoDB.Bson.BsonValue? Кроме того, как MongoDB.Bson.ObjectId и MongoDB.Bson.BsonValue связаны с _id в типичной коллекции MongoDB? - person CS Lewis; 29.10.2015
comment
BSON — это формат сериализации MongoDB. ObjectId — это BsonType. Другие BsonTypes включают Double, String и т. д. BsonValue — это абстрактный класс, который может быть значением в BsonDocument. BsonObjectId является неабстрактным подклассом BsonValue, значение которого имеет тип ObjectId. Другие подклассы BSONValue включают BsonDouble, BsonString, но обычно вы работаете с типами .NET ObjectId, double, string. Код сериализации нижнего уровня работает с BsonValues. - person sheilak; 29.10.2015
comment
Поле _id будет создано автоматически, если вы его не укажете, но вы можете указать его в своем POCO с помощью атрибута [BsonId] или именования поля Id. Это не обязательно должен быть ObjectId. - person sheilak; 29.10.2015