Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一个查询中获取基类和继承类的文档_C#_.net_Mongodb_Polymorphism_Mongodb .net Driver - Fatal编程技术网

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();
        });