通过LINQ导航获取产品关联分类名称及查询语法优化问题
解决方案:获取关联分类名称并改用查询语法
首先,咱们先解决核心问题:要拿到ProductInCategory对应的ProductCategory的Title,关键是让EF Core加载ProductInCategory和ProductCategory之间的关联数据。然后再把查询改成可读性更强的查询语法,同时正确映射到你的ViewModelProduct。
1. 关键修改点:加载关联的分类数据
不管用哪种查询语法,你需要确保EF Core能获取到ProductInCategory关联的ProductCategory对象。有两种可靠方式:
- 预加载(Include + ThenInclude):明确告诉EF要加载嵌套的导航属性
- 投影时直接选择属性:在创建ViewModel时直接引用
ProductCategory的属性,EF会自动查询对应数据
2. 改用查询语法的正确实现
下面是完全符合你需求的查询语法代码,直接映射到ViewModelProduct,同时能获取到分类的Title:
var product = (from p in _context.Products where p.Id == id select new ViewModelProduct { Id = p.Id, Title = p.Title, Info = p.Info, Price = p.Price, // 填充InCategories并包含关联的ProductCategory核心数据 InCategories = p.InCategories.Select(pc => new ProductInCategory { Id = pc.Id, ProductId = pc.ProductId, SortOrder = pc.SortOrder, ProductCategoryId = pc.ProductCategoryId, ProductCategory = new ProductCategory { Id = pc.ProductCategory.Id, Title = pc.ProductCategory.Title, SortOrder = pc.ProductCategory.SortOrder, ParentId = pc.ProductCategory.ParentId } }).ToList(), // 直接填充分类集合,方便视图快速遍历分类名称 Categories = p.InCategories.Select(pc => pc.ProductCategory) }).SingleOrDefault();
3. 为什么之前的查询语法失败?
你之前的查询返回的是匿名类型,而视图需要的是ViewModelProduct类型,类型不匹配直接导致渲染失败。上面的代码直接在select中创建ViewModelProduct实例,把所有需要的属性一一映射好,就能解决这个问题。
4. 视图中如何使用分类Title?
现在你可以在视图里通过两种方式轻松获取分类名称:
- 遍历
InCategories:@foreach (var item in Model.InCategories) { @item.ProductCategory.Title } - 直接遍历
Categories:@foreach (var category in Model.Categories) { @category.Title }
内容的提问来源于stack exchange,提问作者Stian
相关产品推荐
相关产品推荐

