Por que você tem o mesmo "Id ObjectId público"; em cada classe derivada? Não é uma boa ideia. Ele oculta o campo Id pai.
Para resolver seu problema, você precisa "registrar" suas classes derivadas (como em qualquer mecanismo de serialização/desserialização). Existem 3 maneiras de fazer isso:
-
Maneira declarativa - decorar a classe base do Node com:
[BsonKnownTypes(typeof(PlotNode), typeof(EndNode))]
-
Maneira genérica - quando os tipos são conhecidos em tempo de compilação:
BsonClassMap.RegisterClassMap<PlotNode>(); BsonClassMap.RegisterClassMap<EndNode>();
-
Maneira dinâmica - quando os tipos são desconhecidos em tempo de compilação:
BsonClassMap.LookupClassMap(typeof(PlotNode)); BsonClassMap.LookupClassMap(typeof(EndNode));
-
Outra sugestão - use LINQ em vez de Query
Node node = collection.AsQueryable().FirstOrDefault(n => n.Id == id);