从MongoDB获取C#中的记录时正在转换BsonObjectId
本文关键字:转换 BsonObjectId 记录 MongoDB 获取 | 更新日期: 2023-09-27 18:25:02
我今天刚刚开始玩MongoDB,并在数据库中添加了一些记录,现在想用C#读取它们。
这是我的C#对象:
public class Team
{
public string Id { get; set; }
public string TeamId { get; set; }
public string TeamName { get; set; }
public string BadgeSmall { get; set; }
public string BadgeLarge { get; set; }
public string TeamImage { get; set; }
public string Formation { get; set; }
}
这是我从数据库中读取并转换为我的对象的代码:
public IEnumerable<Team> GetTeams()
{
List<Team> model = new List<Team>();
var teams = mongoDatabase.GetCollection("Teams").FindAll().AsEnumerable();
model = (from team in teams
select new Team
{
Id = team["_id"].AsString,
TeamId = team["TeamId"].AsString,
TeamName = team["TeamName"].AsString,
BadgeSmall = team["BadgeSmall"].AsString,
BadgeLarge = team["BadgeLarge"].AsString,
TeamImage = team["TeamImage"].AsString,
Formation = team["Formation"].AsString,
}).ToList();
return model;
}
但我得到的错误如下:
Unable to cast object of type 'MongoDB.Bson.BsonObjectId' to type 'MongoDB.Bson.BsonString'.
这是一个简单的初学者问题,但谷歌搜索并没有给我一个有效的答案。我该如何将BsonObjectId转换为字符串,还是我的方法不对?
编辑:
这是我采用的解决方案,部分取自mnemosyn的答案:
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public MongoCursor<Team> GetTeams()
{
MongoCursor<Team> m = mongoDatabase.GetCollection<Team>("Teams").FindAll();
return m;
}
好吧,您的Id
是string
。这是否是一个好主意几乎是一个哲学问题。我认为独立于数据库是没有意义的,因为您的数据结构无论如何都会绑定到数据库。
MongoDB将尝试实例化类型为Team
的对象,因此,不需要手动将所有数据映射到Team
的实例——Mongo驱动程序会为您做到这一点。这个代码应该做到:
public class Team
{
public ObjectId Id { get; set; }
public string TeamId { get; set; }
public string TeamName { get; set; }
public string BadgeSmall { get; set; }
public string BadgeLarge { get; set; }
public string TeamImage { get; set; }
public string Formation { get; set; }
}
public MongoCursor<Team> GetTeams()
{
return mongoDatabase.Provider.GetCollection<Team>("Teams").FindAll();
}
请注意,我正在重新调整MongoCursor
,而不是IEnumerable
。这有点突兀,因为它使大部分代码依赖于MongoDB驱动程序,但请记住,以下两个语句将具有非常不同的性能特征:
MongoCursor<Team> teams = GetTeams();
// asks MongoDB for the count(), takes milliseconds:
teams.Count();
// calls the IEnumerable extensions method and will actually
// deserialize every Team object in the database(!), taking milliseconds
// per batch of teams. On a large collection, this can take hours:
((IEnumerable)teams).Count();
因此,返回IEnumerable<>
可能会对您的性能产生不利影响。确保你知道你在调用什么方法。