问题升级到最新的C#MongoDB驱动程序

问题升级到最新的C#MongoDB驱动程序,c#,.net,mongodb,mongodb-.net-driver,C#,.net,Mongodb,Mongodb .net Driver,我有一个使用MongoDB的.NET应用程序,所以我使用的是MongoC#driver。我目前使用的版本是1.9.2 我正在尝试将其更新为最新的C#mongodb驱动程序-2.7.0。到目前为止,我不得不对代码进行多次更改,以破坏更改。我现在被一些问题难住了——可能会在适当的时候向其他人提出新的问题,但下面的问题已经导致应用程序在调试时甚至无法加载 这是我使用1.9.2驱动程序的原始代码: /// <summary> /// Since the current Mon

我有一个使用MongoDB的.NET应用程序,所以我使用的是MongoC#driver。我目前使用的版本是1.9.2

我正在尝试将其更新为最新的C#mongodb驱动程序-2.7.0。到目前为止,我不得不对代码进行多次更改,以破坏更改。我现在被一些问题难住了——可能会在适当的时候向其他人提出新的问题,但下面的问题已经导致应用程序在调试时甚至无法加载

这是我使用1.9.2驱动程序的原始代码:

    /// <summary>
    /// Since the current Mongo driver does not support database side Select
    /// projections, we need to use this custom function to achieve the same.
    /// </summary>
    /// <param name="criteria"></param>
    /// <param name="fields"></param>
    /// <returns></returns>
    public IEnumerable<T> Get(Expression<Func<T, bool>> criteria,
        params Expression<Func<T, object>>[] fields)
    {
        return this.Collection.FindAs<T>(Query<T>.Where(criteria)).SetFields
                 (Fields<T>.Include(fields));
    }
我用我的旧C#驱动程序Mongo代码上了一个BsonClassRegistration类-其中的原始代码如下:

        BsonClassMap.RegisterClassMap<EntityBase>(cm =>
        {
            cm.AutoMap();
            cm.SetIdMember(cm.GetMemberMap(x => x.Id).SetIdGenerator(StringObjectIdGenerator.Instance));
            cm.GetMemberMap(c => c.Id).SetRepresentation(BsonType.ObjectId);
        });
BsonClassMap.RegisterClassMap(cm=>
{
cm.AutoMap();
SetIdMember(cm.GetMemberMap(x=>x.Id).SetIdGenerator(StringObjectiveGenerator.Instance));
GetMemberMap(c=>c.Id).SetRepresentation(BsonType.ObjectId);
});
为了通过升级到最新的C#驱动程序解决这个问题,我将代码更改为:

        BsonClassMap.RegisterClassMap<EntityBase>(cm =>
        {
            cm.AutoMap();
            cm.SetIdMember(cm.GetMemberMap(x => x.Id).SetIdGenerator(StringObjectIdGenerator.Instance));
            cm.GetMemberMap(c => c.Id).SetSerializer(new StringSerializer(BsonType.ObjectId));
        });
BsonClassMap.RegisterClassMap(cm=>
{
cm.AutoMap();
SetIdMember(cm.GetMemberMap(x=>x.Id).SetIdGenerator(StringObjectiveGenerator.Instance));
GetMemberMap(c=>c.Id).SetSerializer(新的StringSerializer(BsonType.ObjectId));
});
这就是我现在在Get方法中看到的失败的原因吗?您可以使用
生成器。Projection
就像您尝试过的那样,但是您必须动态地构建
ProjectionDefinition
实例,可以像下面这样做:

public IEnumerable<T> Get(Expression<Func<T, bool>> criteria, params Expression<Func<T, object>>[] fields)
{
    var find = Collection.Find<T>(criteria);

    var builder = Builders<T>.Projection;
    var definition = (ProjectionDefinition<T>)null; 

    foreach(var field in fields)
    {
        definition = definition?.Include(field) ?? builder.Include(field);
    }

    if (definition == null) return find.ToList();

    return find.Project<T>(definition).ToList();
}
public IEnumerable Get(表达式条件,参数表达式[]字段)
{
var find=Collection.find(标准);
var builder=Builders.Projection;
变量定义=(ProjectionDefinition)null;
foreach(字段中的变量字段)
{
定义=定义?包括(字段)?生成器。包括(字段);
}
if(definition==null)返回find.ToList();
返回find.Project(definition.ToList();
}

mickl-这让我更进一步,但我遇到了另一个问题-我已经更新了上面的问题-有什么想法吗?我添加了注释-[BsonRepresentation(BsonType.ObjectId)]在我的EntityBase类的Id属性上,它现在似乎已经工作了-应用程序正在加载,因此这比以前更进一步了。我今天无法测试它,但昨天测试时,我不得不在ObjectId类型的Id属性上添加[BsonId]属性以获得结果。否则,我会得到与你昨天粘贴的相同的异常没有问题,米克尔-我会将你的答案标记为已接受,因为我已经加载了应用程序。不确定我添加的注释是否正确,或者我需要将其更改为您提到的[BsonId]属性。mickl-在下面的问题中遇到过这个问题吗-
        BsonClassMap.RegisterClassMap<EntityBase>(cm =>
        {
            cm.AutoMap();
            cm.SetIdMember(cm.GetMemberMap(x => x.Id).SetIdGenerator(StringObjectIdGenerator.Instance));
            cm.GetMemberMap(c => c.Id).SetSerializer(new StringSerializer(BsonType.ObjectId));
        });
public IEnumerable<T> Get(Expression<Func<T, bool>> criteria, params Expression<Func<T, object>>[] fields)
{
    var find = Collection.Find<T>(criteria);

    var builder = Builders<T>.Projection;
    var definition = (ProjectionDefinition<T>)null; 

    foreach(var field in fields)
    {
        definition = definition?.Include(field) ?? builder.Include(field);
    }

    if (definition == null) return find.ToList();

    return find.Project<T>(definition).ToList();
}