Как получить данные с помощью запроса из MongoDB и с использованием свойств?

#c# #mongodb #oop

#c# #mongodb #ооп

Вопрос:

У меня возник вопрос о том, как использовать класс и использовать его для извлечения элементов из Интернета. (Этот вопрос может быть немного запутанным, пожалуйста, помогите указать, я постараюсь изо всех сил сформулировать вопрос.)

 class Person
{
  public string Name { get; set; }
}

class School : Person
{
  public string Cambridge { get; set; }
}

class Program
{

  public PersonRepository _personRepository;

  static void Main(string[] args)
  {
    // Here i will call the function to retrieve information from the database
    var userData = _personRepository.QueryOne(x => x.Cambridge != null)
    return userData;
  }
}
  

Приведенная выше макетная функция, которую я хочу достичь, может использовать переменную в школе и вызывать из базы данных.
Но это работает не так, как я ожидал.

Я получаю сообщение об ошибке x.Cambridge , Cambridge не найдено. Что это за термин, который его вызывает, и как внести изменения для поддержки и использования переменной в inherit class?

Спасибо.

Комментарии:

1. Как PersonRepository выглядит ваш?

Ответ №1:

Вы можете использовать следующий атрибут [BsonIgnoreExtraElements] , чтобы игнорировать привязку к полям, которые недоступны в документе.

 [BsonIgnoreExtraElements]
public class School : Person
{
     public string Cambridge { get; set; }
}
  

Что касается наследования, вам, возможно, придется использовать Discriminators , более подробная информация об этом доступна здесь

Хотя вот пример:

 [BsonKnownTypes(typeof(School)]
public class Person
{
    public string Name { get; set; }
}
  

Тем не менее, я не большой поклонник полиморфных классов (в вашем случае ваш дизайн вообще не полиморфный). Вам лучше не создавать структуру ваших документов таким образом. На вашем месте я бы сделал это:

 public class Person {
    public String Name {get; set;}
    public School School {get; set;}
}
  

Комментарии:

1. Если для этого, то я могу использовать его для вызова из моего MongoDB? Хотите спросить больше, название моего вопроса в порядке?

2. @Ben: Да, это не влияет ни на что, поддерживаемое MongoDB, это всего лишь атрибут, который определяет драйверу игнорировать дополнительные поля, потому что, поскольку Mongo является базой данных без SQL, этот случай очень распространен и нормален. Если у вас есть еще вопросы, не стесняйтесь задавать мне 🙂

3. если я хочу использовать Person, может ли это быть? Потому что моя текущая функция уже использует Person. Но я хочу запросить еще один для Кембриджа, возможно ли по-прежнему использовать Person вместо School?

4. @Ben: Вы также должны добавить этот атрибут [BsonKnownTypes(typeof(School)] в Person класс.

5. Хорошо, попробую это позже, повлияет ли это на другие существующие функции, которые не требуют для человека права? Спасибо