[英]Converting BsonObjectId when getting record in C# from MongoDB
我今天才刚开始使用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<>
会对您的性能产生不利影响。 确保知道要调用的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.