Mongodb C#驱动程序,如何使用表达式语法使用get only属性查找Object

时间:2015-12-24 12:04:48

标签: c# mongodb mongodb-query

域对象如下:(请注意Age属性仅为get)

public class Person
{
    public ObjectId Id { get; set; }

    public string Name { get; set; }

    public int Age
    {
        get
        {
            return age;
        }
    }
    private int age;

    public Person(int age)
    {
        this.age = age;
    }
}

这是我的测试初始化​​代码:

    private static IMongoClient client;
    private static IMongoDatabase mongoDb;

    [ClassInitialize]
    public static void Initialize(TestContext testContext)
    {
        client = new MongoClient();
        mongoDb = client.GetDatabase("test");
        BsonClassMap.RegisterClassMap<Person>(cm =>
        {
            cm.AutoMap();
            cm.MapField("age").SetElementName("Age");
        });

        var person = new Person(10);
        person.Name = "abai";
        var collection = mongoDb.GetCollection<Person>("persons");
        collection.InsertOne(person);
    }

以下测试将通过:

    [TestMethod]
    public async Task FindPersonByNameTest()
    {
        var collection = mongoDb.GetCollection<Person>("persons");
        var result = await collection.Find<Person>(p => p.Name == "abai").ToListAsync();
        Assert.IsNotNull(result.FirstOrDefault());
    }

但是这个测试将失败

    [TestMethod]
    public async Task FindPersonByAgeTest()
    {
        var collection = mongoDb.GetCollection<Person>("persons");
        var result = await collection.Find<Person>(p => p.Age == 10).ToListAsync();
        Assert.IsNotNull(result.FirstOrDefault());
    }

异常消息如下:

System.InvalidOperationException: {document}.Age is not supported.
Result StackTrace:  
at MongoDB.Driver.Linq.Translators.PredicateTranslator.GetFieldExpression(Expression expression)
   at MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison(Expression variableExpression, ExpressionType operatorType, ConstantExpression constantExpression)
   at MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison(BinaryExpression binaryExpression)
   at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node)
   at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry)
   at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate[TDocument](Expression`1 predicate, IBsonSerializer`1 parameterSerializer, IBsonSerializerRegistry serializerRegistry)
   at MongoDB.Driver.ExpressionFilterDefinition`1.Render(IBsonSerializer`1 documentSerializer, IBsonSerializerRegistry serializerRegistry)
   at MongoDB.Driver.MongoCollectionImpl`1.CreateFindOperation[TProjection](FilterDefinition`1 filter, FindOptions`2 options)
   at MongoDB.Driver.MongoCollectionImpl`1.FindAsync[TProjection](FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken)
   at MongoDB.Driver.FindFluent`2.ToCursorAsync(CancellationToken cancellationToken)
   at MongoDB.Driver.IAsyncCursorSourceExtensions.<ToListAsync>d__16`1.MoveNext()

看起来只有获取Age属性会导致异常。如何使用表达式语法查找具有get only属性的Person对象?谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

您是否愿意摆脱支持字段并向WebBrowser添加私人设定者?如果是这样,这样的事情可能有用:

Age

然后,在你的ClassMap中

public class Person
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public int Age { get; private set; }
    public Person(int age)
    {
        Age = age;
    }
}