我正在使用官方MongoDB C#驱动程序与MongoDB服务器进行通信。 这是我完整的实体计划:
public class Person
{
public ObjectId _id { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public DateTime DateOfBirth { get; set; }
public List<Address> Addresses { get; set; }
}
public class Address
{
public String Street { get; set; }
public String City { get; set; }
}
现在,在某些情况下,我只想获得以下回报:
public class Person_LocationOview
{
public String LastName { get; set; }
public List<Address_CityOnly> Addresses { get; set; }
}
public class Address_CityOnly
{
public String City { get; set; }
}
加载所有字段并自行执行映射的默认行为
MongoCursor<Person>
毫无意义,因为我只想加载特定的字段。 在反射的帮助下,我生成了要加载和发送的字段:
var fields = new { "LastName", "Addresses.City" };
MongoCollection< BsonDocument >.FindAllAs< Person_LocationOview >( )
.SetFields( fields ).ToList( );
我认为MongoDB的序列化器是聪明的;但是调用返回以下错误:
System.IO.FileFormatException:缺少类Models.Address_CityOnly的属性“City”所需的元素“City”
对此要求的任何想法?
答案 0 :(得分:0)
我已经更新了完整的MongoDB基础架构。现在代码适用于所有viewModel,例如Person_LocationOview。使用完整的方案类,代码仍然崩溃,我不知道为什么。
现在,我的所有视图类都在实现自己的接口(IPartialEntityView)。 在我的反射方法中获取字段名称,我将检查此继承,然后我将加载“Addresses.FieldName(s)”。如果属性类型不是默认的.NET类型或者不继承IPartialEntityView,我将使用完整字段“Adresses”。
这很有效。 谢谢大家。