C# 如何使用我使用Entity Framework创建的自动生成类查询一对多关系?

C# 如何使用我使用Entity Framework创建的自动生成类查询一对多关系?,c#,entity-framework-core,C#,Entity Framework Core,我想查询我的数据库以按以下顺序接收对象: [ { "categoryId": 1, "title": "First Category", "subject": ['Subjects Belonging to Category 1'] }, { "categoryId": 2, "title": "Second Category", "subject": ['Subjects

我想查询我的数据库以按以下顺序接收对象:

[
    {
        "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; }
    }
公共部分类类别
{
公共类别()
{
Subject=newhashset();
}
public int CategoryId{get;set;}
公共字符串标题{get;set;}
公共ICollection主题{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;
        }
public ActionResult Get()
{
var categories=_testContext.Category.ToList();
foreach(类别中的var类别)
{
var subjects=_testContext.Subject.Where(c=>c.CategoryId==category.CategoryId.ToArray();
category.Subject=新哈希集(subjects);
}
退货类别;
}

该代码对每个类别执行新的数据库查询,这对性能非常糟糕。除此之外,你说你想要一个主题字符串列表,而不是主题列表,所以你需要一个DTO

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

    public List<string> Subjects { get; set; }
}
公共类categoryTo
{
public int CategoryId{get;set;}
公共字符串标题{get;set;}
公共列表主题{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();
}
公共异步任务Get() { return wait_testContext.Category .AsNoTracking() .选择(类别=>new CategoryTo { CategoryId=cat.CategoryId, 标题=类别标题, Subjects=cat.Subject.Select(sub=>sub.Title.ToList()) }) .ToListAsync(); }
我建议在查询中附加
AsNoTracking()
。@AlexanderSchmidt为什么?不返回实体的投影查询和一般查询是不可跟踪的。因为没有什么可跟踪的:)我使用它来明确说明,并且在我将更改它以最终返回实体时不要忘记它。它更多的是关于可读性和稳定性,而不是技术性的。@AlexanderSchmidt和@Camiloterevento每当你投射你的查询时,它都会自动脱离跟踪。因此,您不需要显式地使用
AsNoTracking()
。@TanvirArjel正如Alexander所提到的,不需要它,只需要显式地说明您想要做什么而没有任何缺点