C# 无法在MongoDb集合查询中将ObjectId反序列化为字符串

C# 无法在MongoDb集合查询中将ObjectId反序列化为字符串,c#,mongodb,casting,mongodb-.net-driver,C#,Mongodb,Casting,Mongodb .net Driver,每当我试图从集合中获取ID列表时: var messages = db.GetCollection<MessageExchange>(collectionName); var ids = messages .AsQueryable() .Where(_=> true) .Select(x => x.Id) .ToList(); 这是不可能的。基于 是否可以在Linq查询中强制转换此内容?您决不一定要使用包中的内容-如果您知道类的定义,我建议在项目

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

var messages = db.GetCollection<MessageExchange>(collectionName);
var ids = messages
   .AsQueryable()
   .Where(_=> true)
   .Select(x => x.Id)
   .ToList();
这是不可能的。基于


是否可以在Linq查询中强制转换此内容?

您决不一定要使用包中的内容-如果您知道类的定义,我建议在项目中滚动您自己的MessageExchange,并使用它使用驱动程序查询集合

这还允许您在新类上使用[BsonIgnoreExtraElements]属性仅获取所需的字段,而不是包的作者强加给您的字段


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

您决不一定要使用包中的内容-如果您知道类的定义,我建议您在项目中滚动自己的MessageExchange,并使用它使用驱动程序查询集合

这还允许您在新类上使用[BsonIgnoreExtraElements]属性仅获取所需的字段,而不是包的作者强加给您的字段

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

否,因为db.GetCollection将集合定义为强类型对象,驱动程序将结合使用linq或其他方式执行的任何进一步逻辑来处理这些对象

您的最佳选择是:

在您自己的代码中定义一个与您的Mongo集合兼容的类,然后使用该类对results db.GetCollection进行反序列化,然后您可以将其与上面的linq查询一起使用以仅选择ID

只需使用默认BsonDocument定义集合并使用投影: db.GetCollection.Findnew BsonDocument.Project{{u id:1}.ToList

否,因为db.GetCollection将集合定义为强类型对象,驱动程序将结合使用linq或其他方式执行的任何进一步逻辑来处理这些对象

您的最佳选择是:

在您自己的代码中定义一个与您的Mongo集合兼容的类,然后使用该类对results db.GetCollection进行反序列化,然后您可以将其与上面的linq查询一起使用以仅选择ID

只需使用默认BsonDocument定义集合并使用投影: db.GetCollection.Findnew BsonDocument.Project{{u id:1}.ToList

实现了一个方法,允许您将对象转换为其字符串表示形式

所以我认为你可以做到:

var messages = db.GetCollection<MessageExchange>(collectionName);
var ids = messages
   .AsQueryable()
   .Where(_=> true)
   .Select(x => x.Id.ToString())
   .ToList();
实现了一个方法,允许您将对象转换为其字符串表示形式

所以我认为你可以做到:

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


请详细说明automapper的用法好吗?@DanielV automapper允许您创建两个模型之间的关系。因此,您不必进行混乱的新消息交换和手动分配属性。您只需执行var messageExchange=mapper.MapyourNewMessageExchangeObject;我明白,我正在探索@steveland方法来实现完全独立的东西,因为我需要的是ID不关心对象actually@DanielV我肯定会选择史蒂文回答的第二个选项!请详细说明automapper的用法好吗?@DanielV automapper允许您创建两个模型之间的关系。因此,您不必进行混乱的新消息交换和手动分配属性。您只需执行var messageExchange=mapper.MapyourNewMessageExchangeObject;我明白,我正在探索@steveland方法来实现完全独立的东西,因为我需要的是ID不关心对象actually@DanielV我肯定会选择史蒂文回答的第二个选项!你想要一个字符串列表还是一个对象ID列表?只需要一个ID列表,如果是字符串就更好。你想要一个字符串列表还是一个对象ID列表?只需要一个ID列表,如果是字符串就更好。类似选项2!我没想到。这将使代码库中的开销最小。@cl0ud-选项2已更新,我忘记了包含。FindI刚刚用以下代码实现了它:var myIds=db.GetCollectioncollectionName.Find=>true.ProjectBuilders.Projection.include\u id.ToList;这是工作和创建如下元素:{{{u id:cc969282-c9d2-4cba-a776-d79ff1274d56}我喜欢选项2!我没想到。这将使代码库中的开销最小。@cl0ud-选项2已更新,我忘记了包含。FindI刚刚用以下代码实现了它:var myIds=db.GetCollectioncollectionName.Find=>true.ProjectBuilders.Projection。
包括_id.ToList;这是工作和创建如下元素:{{{{u id:cc969282-c9d2-4cba-a776-d79ff1274d56}}Steves的方法似乎是正确的,谢谢你的回复。Steves的方法似乎是正确的,谢谢你的回复。