从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;
        }

从MongoDB获取C#中的记录时正在转换BsonObjectId

好吧,您的Idstring。这是否是一个好主意几乎是一个哲学问题。我认为独立于数据库是没有意义的,因为您的数据结构无论如何都会绑定到数据库。

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<>可能会对您的性能产生不利影响。确保你知道你在调用什么方法。