You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:46:17