EF Core多对多查询关联3表获取产品及厂商名称的实现问题
解决方案
你遇到的Manufacturer对象为空的问题,是因为你仅加载了一级导航属性ProductManufacturer,没有加载该中间表实体下嵌套的Manufacturer导航属性,可通过以下两种方式实现单次查询同时获取产品名和厂商名:
方法1:使用Include+ThenInclude加载完整导航树
如果需要保留完整的实体关联结构,可以通过嵌套加载的方式拉取所有关联数据:
var result = DbSet<ProductTbl>() .Where(a => a.Id == 5) .AsNoTracking() .Include(a => a.ProductType) .Include(a => a.ProductManufacturer) .ThenInclude(pm => pm.Manufacturer) // 加载中间表关联的Manufacturer_LKP数据 .FirstOrDefault();
获取数据后,可通过遍历result.ProductManufacturer集合,访问item.Manufacturer.ManufacturerName得到厂商名称。
方法2:使用投影查询(推荐,性能更高)
如果仅需要ProductName和ManufacturerName两个字段,无需加载完整实体,可直接使用投影查询,EF会自动生成关联SQL,无需手动声明Include:
var productManufacturerList = DbSet<ProductTbl>() .Where(a => a.Id == 5) .AsNoTracking() .SelectMany(p => p.ProductManufacturer.Select(pm => new { ProductName = p.ProductName, ManufacturerName = pm.Manufacturer.ManufacturerName })) .ToList();
该方法返回的集合中每条记录对应一个产品和一个关联厂商的组合,可直接拿到所需字段,查询返回的数据量更小,性能更优。
内容的提问来源于stack exchange,提问作者Ehab
相关产品推荐
相关产品推荐

