2012-03-02 82 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。

相關問題