Защо имате същия "public ObjectId Id;" във всеки извлечен клас? Това не е наистина добра идея. Скрива полето за идентификатор на родител.
За да решите проблема си, трябва да "регистрирате" извлечените си класове (както във всеки механизъм за сериализация/десериализация). Има 3 начина да го направите:
-
Декларативен начин - украсете базовия възел клас с:
[BsonKnownTypes(typeof(PlotNode), typeof(EndNode))]
-
Общ начин - когато типовете са известни по време на компилиране:
BsonClassMap.RegisterClassMap<PlotNode>(); BsonClassMap.RegisterClassMap<EndNode>();
-
Динамичен начин - когато типовете са неизвестни по време на компилиране:
BsonClassMap.LookupClassMap(typeof(PlotNode)); BsonClassMap.LookupClassMap(typeof(EndNode));
-
Още едно предложение - използвайте LINQ вместо Query
Node node = collection.AsQueryable().FirstOrDefault(n => n.Id == id);