Perché hai lo stesso "ID ObjectId pubblico"; in ogni classe derivata? Non è proprio una buona idea. Nasconde il campo ID genitore.
Per risolvere il tuo problema devi "registrare" le tue classi derivate (come in qualsiasi meccanismo di serializzazione/deserializzazione). Ci sono 3 modi per farlo:
-
Modalità dichiarativa - decorare la classe Node base con:
[BsonKnownTypes(typeof(PlotNode), typeof(EndNode))]
-
Modo generico - quando i tipi sono noti in fase di compilazione:
BsonClassMap.RegisterClassMap<PlotNode>(); BsonClassMap.RegisterClassMap<EndNode>();
-
Modo dinamico - quando i tipi sono sconosciuti in fase di compilazione:
BsonClassMap.LookupClassMap(typeof(PlotNode)); BsonClassMap.LookupClassMap(typeof(EndNode));
-
Un altro suggerimento - usa LINQ invece di Query
Node node = collection.AsQueryable().FirstOrDefault(n => n.Id == id);