C# 在一个查询中获取基类和继承类的文档
我有一个C# 在一个查询中获取基类和继承类的文档,c#,.net,mongodb,polymorphism,mongodb-.net-driver,C#,.net,Mongodb,Polymorphism,Mongodb .net Driver,我有一个Mongo的TaskBase文档集合任务库有三个子类。我为此集合创建了一个集合管理器(从我已经使用的通用管理器)。当我创建、更新或检索TaskBase的子类时,我得到了正确的类型,没有异常 我创建了以下方法: public IEnumerable<TaskBase> GetTasksByAppId(string appId) { var entityQuery = Query<TaskBase>.EQ(t => t.AppOId, appId);
Mongo的TaskBase
文档集合<代码>任务库有三个子类。我为此集合创建了一个集合管理器(从我已经使用的通用管理器)。当我创建、更新或检索TaskBase
的子类时,我得到了正确的类型,没有异常
我创建了以下方法:
public IEnumerable<TaskBase> GetTasksByAppId(string appId)
{
var entityQuery = Query<TaskBase>.EQ(t => t.AppOId, appId);
return this.MongoConnectionHandler.MongoCollection.Find(entityQuery).ToList();
}
public IEnumerable GetTasksByAppId(字符串appId)
{
var entityQuery=Query.EQ(t=>t.AppOId,appId);
返回此.MongoConnectionHandler.MongoCollection.Find(entityQuery.ToList();
}
当我运行此程序时,我得到一个异常,即元素[仅存在于子类中的某些元素]不是TaskBase的属性或成员
我理解为什么会出现此异常,我只是不知道该怎么办。
我想获取与应用程序关联的所有任务类型的集合。您需要向驱动程序显示您的类层次结构。有两个选项,第一个使用BsonKnownTypes
和BsonDiscriminator
属性,另一个使用BsonClassMap
属性
用希望包含的特定派生类装饰基类(类似于在WCF
中所做的操作)。要告诉驱动程序它是根,您还需要BsonDiscriminator
:
[BsonDiscriminator(RootClass = true)]
[BsonKnownTypes(typeof(ConcreteTask))]
public class TaskBase
{
}
BsonClassMap
参加聚会有点晚了,在i3arnon的回答之后,如果您想在不向类添加属性的情况下向驱动程序显示您的类层次结构,那么可以通过以下方式遵循BsonClassMap选项
BsonClassMap.RegisterClassMap<TaskBase>(cm =>
{
cm.AutoMap();
cm.SetIsRootClass(true);
});
BsonClassMap.RegisterClassMap<ConcreteTask>(cm =>
{
cm.AutoMap();
});
BsonClassMap.RegisterClassMap(cm=>
{
cm.AutoMap();
cm.SetIsRootClass(真);
});
BsonClassMap.RegisterClassMap(cm=>
{
cm.AutoMap();
});
得到同样的结果:
{{u t:[“TaskBase”,“ConcreteTask”]}@EladLachmi当然,随时可以。
{ _t : ["TaskBase", "ConcreteTask"] }
BsonClassMap.RegisterClassMap<TaskBase>(cm =>
{
cm.AutoMap();
cm.SetIsRootClass(true);
});
BsonClassMap.RegisterClassMap<ConcreteTask>(cm =>
{
cm.AutoMap();
});