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

本文关键字:基类 继承 文档 获取 查询 一个 | 更新日期: 2023-09-27 18:09:57

我有一个TaskBase文档的Mongo CollectionTaskBase有三个子类。我为这个集合创建了一个集合管理器(从我已经使用的通用管理器创建)。当我创建、更新或检索TaskBase的子类时,我得到了正确的类型,没有异常。

我创建了以下方法:

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

当我运行这个,我得到一个异常,Element [some element existing only in a subclass] is not a property or member of TaskBase我明白为什么我得到这个异常,我只是不知道该怎么做。我想得到的所有类型的任务,可以与应用程序相关联的集合。

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

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

性>

用您想要包含的特定派生类修饰您的基类(类似于您在WCF中所做的事情)。要告诉驱动程序它是根目录,还需要BsonDiscriminator:

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

BsonClassMap

BsonClassMap.RegisterClassMap<TaskBase>();
BsonClassMap.RegisterClassMap<ConcreteTask>();
结果

因此,文档的类型标识符(_t)将是一个数组,而不是单个值。在本例中:
{ _t : ["TaskBase", "ConcreteTask"] }

有点晚了,遵循i3arnon的回答,如果您想向驱动程序显示您的类层次结构,而不向您的类添加属性,您可以以这样的方式遵循BsonClassMap选项

        BsonClassMap.RegisterClassMap<TaskBase>(cm =>
        {
            cm.AutoMap();
            cm.SetIsRootClass(true);
        });
        BsonClassMap.RegisterClassMap<ConcreteTask>(cm =>
        {
            cm.AutoMap();
        });

,得到相同的结果:{_t: ["TaskBase", "ConcreteTask"]}