每当我试图从集合中获取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查询中转换它?
不,因为db.GetCollection<MessageExchange>
将集合定义为强类型对象,驱动程序将与执行的任何其他逻辑(使用linq或其他)一起处理。
您最好的选择是:
db.GetCollection<MyCustomMessageExchange>
,然后您可以使用上面的linq查询来选择id。BsonDocument
来定义您的集合并使用投影:db.GetCollection<BsonDocument>.Find(new BsonDocument()).Project("{_id: 1}").ToList()
你绝不一定要在包中使用什么 - 如果你知道类的定义是什么我会建议在你的项目中滚动你自己的MessageExchange
并使用它来使用驱动程序查询集合。
这样您也可以只获取所需的字段(在新类中使用[BsonIgnoreExtraElements]
属性),而不是包的作者对您的强制要求。
如果使用类型MessageExchange
对于您的程序流程和结构是绝对必要的.Id建议使用类似AutoMapper的东西从您自己的类型转换回原始类型。
ObjectId structure实现了ToString方法,允许您将对象转换为其字符串表示形式。
所以我认为你可以这样做:
var messages = db.GetCollection<MessageExchange>(collectionName);
var ids = messages
.AsQueryable()
.Where(_=> true)
.Select(x => x.Id.ToString())
.ToList();