Entity Framework Core嵌套ThenInclude查询如何仅返回Customer指定字段
要实现仅返回Customer类指定字段的需求,不能仅依靠Include/ThenInclude(这两个方法的作用是加载完整的关联实体,不支持字段级裁剪),需要使用投影查询(即Select方法)自定义返回结构,示例代码如下:
方案1:投影到原有实体类型(保持返回结构和原实体一致)
var result = await catalogdb.A .Select(a => new A { // 完整赋值A的所有字段 city = a.city, b = a.b.Select(b => new B { // 完整赋值B的所有字段 country = b.country, course = b.course, c = new C { // 完整赋值C的所有字段 Name = b.c.Name, address = b.c.address, postCode = b.c.postCode, // 仅赋值Customer需要的两个字段 customer = new Customer { FullName = b.c.customer.FullName, CustomerImage = b.c.customer.CustomerImage } } }).ToList() }) .ToListAsync();
方案2:投影到匿名类型(无需定义新类,适合内部使用)
如果不需要对外暴露原实体类型,也可以用匿名类型接收结果,写法更灵活:
var result = await catalogdb.A .Select(a => new { a.city, BList = a.b.Select(b => new { b.country, b.course, CInfo = new { b.c.Name, b.c.address, b.c.postCode, CustomerInfo = new { b.c.customer.FullName, b.c.customer.CustomerImage } } }) }) .ToListAsync();
说明
- 上述写法生成的SQL会自动裁剪不需要的字段,不会查询
Customer的Fulladdress字段,性能优于全量Include查询 - 所有EF Core版本均支持该写法,EF Core 5+对嵌套投影的优化更完善
- 如果项目中使用了AutoMapper,也可以通过配置
Customer的映射规则,使用ProjectTo方法自动完成投影,无需手动编写字段赋值逻辑。
内容的提问来源于stack exchange,提问作者AG Mohamed
相关产品推荐
相关产品推荐

