C# 从类映射中检索元素名称

C# 从类映射中检索元素名称,c#,mongodb,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(

下面是我映射到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(“things”);
Save(newthing(){Foo=“one”,Bar=“two”});
但当我想要搜索它时,我必须显式地将元素名称指定为字符串:

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

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

从编译器的角度来看,目前还不支持在官方驱动程序的v1.3.1中进行查询。我们目前正在研究LINQ支持,这将有助于映射到元素名称(https://jira.mongodb.org/browse/CSHARP-91). 如果您想在LINQ之外看到此内容,请在

处提交增强请求,如果您想将您的类映射保存在私人成员中,如下所示:

private static BsonClassMap<Thing> _thingClassMap = BsonClassMap.RegisterClassMap<Thing>();
私有静态BsonClassMap\u thingClassMap=BsonClassMap.RegisterClassMap();

您可以提取元素名称:

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

然后你可以创建一个函数来包装提取元素名的行, 这仍然很烦人,但我想这是我们目前得到的最好的了

 private string GetTypeMemberName<T>(Expression<Func<Foo, T>> memberLambda)
 {
        return _classMap.GetMemberMap<T>(memberLambda).ElementName;
 }
私有字符串GetTypeMemberName(表达式memberLambda)
{
返回_classMap.GetMemberMap(memberLambda).ElementName;
}
然后,您可以通过以下方式获得元素名称:

string elementName = GetTypeMemberName<string>(c => c.Foo);
stringelementname=GetTypeMemberName(c=>c.Foo);
然后,如果您重构代码并在以后重命名属性,它也将在查询中更改

当然,您也可以只使用LINQ