这是我映射到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"));
编译器无法帮助解决这些问题。我必须引用我的类文件,复制元素名称,并将其粘贴到查询中。如果我稍后更改元素名称,编译器将无法确保在查询中更改它,更不用说为我更改它。还有更好的方法吗?
答案 0 :(得分:1)
目前没有编译器视角支持在官方驱动程序的v1.3.1中查询。我们目前正致力于LINQ支持,它应该有助于映射到元素名称。(https://jira.mongodb.org/browse/CSHARP-91)。如果您想在LINQ之外看到这个,请在https://jira.mongodb.org/browse/CSHARP
提交增强请求答案 1 :(得分: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。