2012-03-02 51 views
0

这里是我映射到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")); 

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

回答

1

从编译器的角度来看,官方驱动程序的v1.3.1查询目前没有支持。我们目前正在开发LINQ支持,这将有助于映射元素名称(https://jira.mongodb.org/browse/CSHARP-91)。如果你想看看这外面LINQ请https://jira.mongodb.org/browse/CSHARP

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。

相关问题