Proč máte stejné "public ObjectId Id;" v každé odvozené třídě? To opravdu není dobrý nápad. Skryje nadřazené pole ID.
Chcete-li vyřešit svůj problém, musíte „zaregistrovat“ své odvozené třídy (jako v jakémkoli mechanismu serializace/deserializace). Existují 3 způsoby, jak to udělat:
-
Deklarativní způsob - ozdobte základní třídu uzlu pomocí:
[BsonKnownTypes(typeof(PlotNode), typeof(EndNode))]
-
Obecný způsob - když jsou typy známé v době kompilace:
BsonClassMap.RegisterClassMap<PlotNode>(); BsonClassMap.RegisterClassMap<EndNode>();
-
Dynamický způsob - když jsou typy v době kompilace neznámé:
BsonClassMap.LookupClassMap(typeof(PlotNode)); BsonClassMap.LookupClassMap(typeof(EndNode));
-
Další návrh - použijte LINQ místo Query
Node node = collection.AsQueryable().FirstOrDefault(n => n.Id == id);