无法在MongoDb集合查询中从ObjectId反序列化为String

问题描述 投票:1回答:3

每当我试图从集合中获取ID列表时:

var messages = db.GetCollection<MessageExchange>(collectionName);
var ids = messages
   .AsQueryable()
   .Where(_=> true)
   .Select(x => x.Id)
   .ToList();

我收到一个演员错误:

System.FormatException HResult = 0x80131537 Message =无法从BsonType'ObjectId'反序列化'String'。 Source = StackTrace:

我无法修改类的定义,因为它在包中实现我无法更改。因此放置的解决方案:

[BsonRepresentation(BsonType.ObjectId)] 

在它上面,是不可能的。基于this

是否可以在Linq查询中转换它?

c# mongodb casting mongodb-.net-driver
3个回答
3
投票

不,因为db.GetCollection<MessageExchange>将集合定义为强类型对象,驱动程序将与执行的任何其他逻辑(使用linq或其他)一起处理。

您最好的选择是:

  1. 在您自己的代码中定义一个与您的Mongo Collection兼容的类,然后使用该类反序列化您的结果db.GetCollection<MyCustomMessageExchange>,然后您可以使用上面的linq查询来选择id。
  2. 只需使用默认的BsonDocument来定义您的集合并使用投影:db.GetCollection<BsonDocument>.Find(new BsonDocument()).Project("{_id: 1}").ToList()

2
投票

你绝不一定要在包中使用什么 - 如果你知道类的定义是什么我会建议在你的项目中滚动你自己的MessageExchange并使用它来使用驱动程序查询集合。

这样您也可以只获取所需的字段(在新类中使用[BsonIgnoreExtraElements]属性),而不是包的作者对您的强制要求。

如果使用类型MessageExchange对于您的程序流程和结构是绝对必要的.Id建议使用类似AutoMapper的东西从您自己的类型转换回原始类型。


1
投票

ObjectId structure实现了ToString方法,允许您将对象转换为其字符串表示形式。

所以我认为你可以这样做:

var messages = db.GetCollection<MessageExchange>(collectionName);
var ids = messages
   .AsQueryable()
   .Where(_=> true)
   .Select(x => x.Id.ToString())
   .ToList();
© www.soinside.com 2019 - 2024. All rights reserved.