繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM