在一个查询中获取基类和继承类的文档

Ela*_*hmi 2 .net c# polymorphism mongodb mongodb-.net-driver

我有一个Mongo CollectionTaskBase文件。TaskBase有三个子类。我为此集合创建了一个集合管理器(从我已经使用的通用管理器中)。当我创建,更新或检索TaskBase我的子类时,我将获得正确的类型,也不例外。

我创建了以下方法:

public IEnumerable<TaskBase> GetTasksByAppId(string appId)
{
   var entityQuery = Query<TaskBase>.EQ(t => t.AppOId, appId);
   return this.MongoConnectionHandler.MongoCollection.Find(entityQuery).ToList();
}
Run Code Online (Sandbox Code Playgroud)

当我运行此程序时,我得到一个例外,Element [some element existing only in a subclass] is not a property or member of TaskBase我理解为什么会收到此例外,我只是不知道该怎么办。我想收集可以与某个应用程序关联的所有任务类型的集合。

i3a*_*non 5

您需要向驱动程序显示您的类层次结构。有2个选项,第一个使用BsonKnownTypesBsonDiscriminator属性,另一个使用BsonClassMap

属性

用要包括的特定派生类装饰基类(类似于在中执行的操作WCF)。要告诉驱动程序它是根目录,您还需要BsonDiscriminator

[BsonDiscriminator(RootClass = true)]
[BsonKnownTypes(typeof(ConcreteTask))]
public class TaskBase
{

}
Run Code Online (Sandbox Code Playgroud)

BsonClassMap

BsonClassMap.RegisterClassMap<TaskBase>();
BsonClassMap.RegisterClassMap<ConcreteTask>();
Run Code Online (Sandbox Code Playgroud)

结果

结果,文档的类型鉴别符(_t)将是一个数组,而不是单个值。在这种情况下:

{ _t : ["TaskBase", "ConcreteTask"] }
Run Code Online (Sandbox Code Playgroud)