Как я могу заполнить коллекцию внутри DTO с помощью LINQ?

#c# #.net #linq #dto

#c# #.net #linq #dto

Вопрос:

Я создал следующий DTO:

     public class TestAndQuestionDTO
    {
        public string Name { get; set; }
        public int QuestionsCount { get; set; }
        public ICollection<TestAndQuestionDTO.Questions> TestQuestions { get; set; }

        public class Questions
        {
            public Guid QuestionUId { get; set; }
        }
    }
  

Я пытаюсь заполнить это с помощью LINQ, но я застрял на том, как заполнить класс внутренних вопросов.

Вот что у меня есть на данный момент:

     var result = await db.Tests
            .Include(t => t.TestQuestions)
            .Where(t => t.TestId == id)
            .Select(t => new TestAndQuestionDTO
            {
                Name = t.Title,
                TestQuestions = new TestAndQuestionDTO.Questions
                {
                    QuestionUId = t.TestQuestions. ????
                }

            })
            .ToListAsync();
  

Может кто-нибудь сказать мне, как я могу заполнить поле коллекции TestQuestions данными, которые возвращаются из моей коллекции: .Include(t => t.TestQuestions) Должен ли я, например, иметь конструктор в TestAndQuestionDTO для создания коллекции тестовых вопросов?

Вот мой тестовый класс для справки:

 public partial class Test
{
    public Test()
    {
        this.TestQuestions = new HashSet<TestQuestion>();
    }

    public int TestId { get; set; }
    public string Title { get; set; }
    public virtual ICollection<TestQuestion> TestQuestions { get; set; }

}
  

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

1. Почему вы не можете просто сделать TestQuestions = t.TestQuestions в select?

2. Потому что класс TestQuestions слева имеет только одно поле, а t.TestQuestions имеет много полей. Поправьте меня, если я ошибаюсь, но я думал, что я должен сопоставить их все один к одному.

Ответ №1:

Вы можете использовать другой Select для преобразования в ваши вопросы DTO следующим образом:

 var result = await db.Tests
        .Include(t => t.TestQuestions)
        .Where(t => t.TestId == id)
        .Select(t => new TestAndQuestionDTO
        {
            Name = t.Title,
            TestQuestions = t.TestQuestions.Select(tq => new TestAndQuestionDTO.Questions
            {
                QuestionUId = tq.QuestionUId,
                //fill in your Questions DTO here
            })

        })
        .ToListAsync();
  

Если вам нужно TestAndQuestionDTO.Questions быть ICollection<> типом, измените его на это:

 var result = await db.Tests
        .Include(t => t.TestQuestions)
        .Where(t => t.TestId == id)
        .Select(t => new TestAndQuestionDTO
        {
            Name = t.Title,
            TestQuestions = new Collection<TestAndQuestionDTO.Questions>(
                t.TestQuestions.Select(tq => new TestAndQuestionDTO.Questions
                {
                    QuestionUId = tq.QuestionUId,
                    //fill in your Questions DTO here
                }).ToList())
        })
        .ToListAsync();
  

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

1. Я получаю сообщение об ошибке: ‘System. Коллекции. Общий. IEnumerable Контроллеры. TestController. TestAndQuestionDTO.Questions>’ to ‘System. Коллекции. Общий. ICollection Контроллеры. TestController. TestAndQuestionDTO.Вопросы>’.

2. Test‌​AndQuestionDTO.Questions Должно ли быть ICollection вместо IEnumerable ?

3. Я предпочитаю работать с IEnumerable , поэтому я бы изменил это на это. В противном случае я сделал дополнение к своему ответу.