#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.
TestAndQuestionDTO.Questions
Должно ли бытьICollection
вместоIEnumerable
?3. Я предпочитаю работать с
IEnumerable
, поэтому я бы изменил это на это. В противном случае я сделал дополнение к своему ответу.