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所提到的,不需要它,只需要显式地说明您想要做什么而没有任何缺点