正在从类映射检索元素名称

本文关键字:元素 检索 映射 | 更新日期: 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。