正在从类映射检索元素名称
本文关键字:元素 检索 映射 | 更新日期: 2023-09-27 18:26:33
下面是我映射到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"));
编译器无法帮助处理这些查询。我必须引用我的类文件,复制元素名称,并将其粘贴到查询中。如果我以后更改元素名称,编译器不会确保我在查询中更改了它,更不用说为我更改了。有更好的方法吗?
在官方驱动程序的v1.3.1中,编译器目前不支持查询。我们目前正在研究LINQ支持,这将有助于映射到元素名称。(https://jira.mongodb.org/browse/CSHARP-91)。如果您想在LINQ之外看到这一点,请在https://jira.mongodb.org/browse/CSHARP
如果您要将类映射保存在私人成员中,如:
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。