Получение объекта Dynami c вместо строго типизированного из MongoDB in. net core c# - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь использовать MongoDB в сочетании с ядром. net (c#), чтобы сохранить некоторые результаты опроса.

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

Я могу сохранять разные типы результатов в одной таблице.

public class VoteBase
{
    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }
    public User User { get; set; }
    public Control Control { get; set; }
    public string ControlType { get; set; }
}



public class VoteStarRatingControl : VoteBase
{
    public int? Rating { get; set; }
}



public class VoteStarRatingWithComment : VoteStarRatingControl
{
    public string Comment { get; set; }
}

Я создал таблицу базового типа как MongoCollection:

        private readonly IMongoCollection<VoteBase> _voteBases;

Чтобы сохранить ее в этой коллекции, я использовал этот код (где DTO - это тот же объект передачи данных контента, чтобы отделить Служба REST из структуры БД):

List<VoteBase> dbVotes = new List<VoteBase>();

foreach (VoteBaseDTO v in votes)
{
    switch (v) {
        case VoteStarRatingWithCommentDTO src:
            dbVotes.Add(new VoteStarRatingWithComment() { User = new User() { Id = UserId }, Control = new Control() { Id = src.ControlId }, Rating = src.Rating, Comment = src.Comment });
            break;
        case VoteStarRatingControlDTO sr:
            dbVotes.Add(new VoteStarRatingControl() { User = new User() { Id = UserId }, Control = new Control() { Id = sr.ControlId }, Rating = sr.Rating });
            break;
    }

}

_voteBases.InsertMany(dbVotes);

return dbVotes;

Пока здесь все работает нормально.

Теперь я пытаюсь вернуть голоса для определенного c списка элементов управления (для одного опроса).

Следующая команда завершается неудачно с

«Элемент« Рейтинг »не соответствует ни одному полю или свойству класса SurveyToolRestAPI.Models.VoteBase. '

 object obj = _voteBases.Find(vb => vb.Control.Id == "5e9c24c50a099728b027e176").SingleOrDefault();

Это потому, что он имеет тип StarRatingControl вместо типа VoteBase.

Есть ли способ получить список как динамический c вместо строго типизированного из коллекции MongoDB?

1 Ответ

0 голосов
/ 27 апреля 2020

Спасибо, Эльдо, вы указали мне правильное направление.

Проводим еще несколько исследований с атрибутами Bson ... Я наконец нашел решение в этом посте Коллекция Mongodb в качестве динамического c

Ключ в том, чтобы добавить Атрибут BsonKnownTypes. Он может использоваться в качестве строго типизированной коллекции, и список будет содержать соответствующие подтипы.

    [BsonKnownTypes(typeof(VoteBase), typeof(VoteStarRatingControl), typeof(VoteStarRatingWithComment))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...