如何从CartItem和Product两个对象列表创建一个List<>
解决方案
方法一:EF关联查询+元组列表
直接通过EF的Join操作一次性从数据库获取配对的购物车项与商品,避免循环内多次查询数据库的低效问题,同时组装成你尝试过的元组列表:
public async Task<IActionResult> Index() { var username = User.Identity.Name; if (username == null) { return Login(); } var user = await _context.Users.FirstOrDefaultAsync(x => x.Email == username); if (user == null) { return NotFound(); } // 关联查询并生成(CartItem, Product)元组列表 var cartWithProducts = await _context.ShoppingCartItems .Where(s => s.IDuser == user.Id) .Join( _context.Product, cartItem => cartItem.ProductId, product => product.id, (cartItem, product) => (cartItem, product) ) .ToListAsync(); // 注意:需要同步修改视图的模型类型为List<(CartItem, Product)> return View(cartWithProducts); }
方法二:自定义ViewModel(推荐,可读性更强)
如果元组的可读性不足,可以自定义ViewModel来封装配对数据:
// 新增ViewModel类 public class CartProductPair { public CartItem CartItem { get; set; } public Product Product { get; set; } }
修改控制器代码:
public async Task<IActionResult> Index() { var username = User.Identity.Name; if (username == null) { return Login(); } var user = await _context.Users.FirstOrDefaultAsync(x => x.Email == username); if (user == null) { return NotFound(); } var cartWithProducts = await _context.ShoppingCartItems .Where(s => s.IDuser == user.Id) .Join( _context.Product, cartItem => cartItem.ProductId, product => product.id, (cartItem, product) => new CartProductPair { CartItem = cartItem, Product = product } ) .ToListAsync(); return View(cartWithProducts); }
关键优化说明
- 替换同步查询方法为异步版本(
FirstOrDefaultAsync/ToListAsync),符合ASP.NET Core异步编程规范 - 用
Join实现单次数据库查询,解决原代码中循环查询导致的N+1性能问题 - 增加用户不存在的判断,避免空引用异常
内容的提问来源于stack exchange,提问作者Try Parse
相关产品推荐
相关产品推荐

