从类映射中检索元素名称

时间:2012-03-02 18:38:16

标签: c# mongodb

这是我映射到MongoDB的类:

public class Thing
{
    [BsonId]
    public ObjectId Id { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }
}

将它保存到集合中非常棒:

var collection = db.GetCollection<Thing>("things");
collection.Save(new Thing() {Foo = "one", Bar = "two"});

但是当我想搜索它时,我必须明确地将元素名称指定为字符串:

var collection = db.GetCollection<Thing>("things");
collection.Find(Query.EQ("Foo", "one"));

编译器无法帮助解决这些问题。我必须引用我的类文件,复制元素名称,并将其粘贴到查询中。如果我稍后更改元素名称,编译器将无法确保在查询中更改它,更不用说为我更改它。还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

目前没有编译器视角支持在官方驱动程序的v1.3.1中查询。我们目前正致力于LINQ支持,它应该有助于映射到元素名称。(https://jira.mongodb.org/browse/CSHARP-91)。如果您想在LINQ之外看到这个,请在​​https://jira.mongodb.org/browse/CSHARP

提交增强请求

答案 1 :(得分:1)

如果您将类别地图保存在私人会员中,请执行以下操作:

private static BsonClassMap<Thing> _thingClassMap = BsonClassMap.RegisterClassMap<Thing>();

...

你可以提取元素名称:

string elementName = _thingClassMap.GetMemberMap<string>(c => c.Foo).ElementName;

...

然后你可以创建一个包装提取元素名称的行的函数, 它仍然很烦人,但这是我猜的那一刻我们得到的最好的......

 private string GetTypeMemberName<T>(Expression<Func<Foo, T>> memberLambda)
 {
        return _classMap.GetMemberMap<T>(memberLambda).ElementName;
 }

然后您可以通过以下方式获取元素名称:

string elementName = GetTypeMemberName<string>(c => c.Foo);

然后,如果您重构代码并稍后重命名该属性,它也会在查询中更改。

当然,您也可以使用LINQ。