Как запросить отношение один ко многим, используя автоматически сгенерированный класс, который я создал с помощью Entity Framework? - PullRequest
1 голос
/ 18 мая 2019

Я хочу запросить в моей базе данных получить объект в следующем порядке:

[
    {
        "categoryId": 1,
        "title": "First Category",
        "subject": ['Subjects Belonging to Category 1']
    }, 
    {
        "categoryId": 2,
        "title": "Second Category",
        "subject": ['Subjects Belonging to Category 2']
    }

]

из этого класса:

public partial class Category
    {
        public Category()
        {
            Subject = new HashSet<Subject>();
        }

        public int CategoryId { get; set; }
        public string Title { get; set; }

        public ICollection<Subject> Subject { get; set; }
    }

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

public ActionResult<IEnumerable<Category>> Get()
        {
            var categories = _testContext.Category.ToList();

            foreach(var category in categories)
            {
                var subjects = _testContext.Subject.Where(c => c.CategoryId == category.CategoryId).ToArray();
                category.Subject = new HashSet<Subject>(subjects);
            }

            return categories;
        }

1 Ответ

1 голос
/ 18 мая 2019

Этот код выполняет новый запрос к базе данных для каждой категории, что сказывается на производительности.Кроме того, вы говорите, что вам нужен список строк для предметов, а не список предметов, поэтому вам нужен DTO.

public class CategoryDTO
{
    public int CategoryId { get; set; }
    public string Title { get; set; }

    public List<string> Subjects { get; set; }
}

, который вы бы использовали как:

public async Task<ActionResult<List<CategoryDTO>>> Get()
{
    return await _testContext.Category
        .AsNoTracking()
        .Select(cat => new CategoryDTO
        {
            CategoryId = cat.CategoryId,
            Title = cat.Title,
            Subjects = cat.Subject.Select(sub => sub.Title).ToList()
        })
        .ToListAsync();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...