首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从两个对象列表中生成List<>

如何从两个对象列表中生成List<>
EN

Stack Overflow用户
提问于 2022-12-02 12:07:36
回答 3查看 59关注 0票数 0

我有object CartItem和Product。我需要用这两个对象做一个List<>。

尝试:List<(CartItem,Product)> product = new List<(CartItem,Product)>();

代码:

代码语言:javascript
运行
复制
      public async Task<IActionResult> Index()
        {
            var username = User.Identity.Name;

            if (username == null)
            {
                return Login();
            }
            var user = _context.Users.FirstOrDefault(x => x.Email == username);
            List<CartItem> cart = _context.ShoppingCartItems.Where(s => s.IDuser.Equals(user.Id)).ToList();
            List<Product> product = new List<Product>();


            foreach (var item in cart)
            {
                product.Add(_context.Product.FirstOrDefault(x => x.id == item.ProductId));
            }
            

            return View(user);
        }
EN

Stack Overflow用户

回答已采纳

发布于 2022-12-02 12:19:19

正确的答案是不要这样做。5项和2项产品的预期结果是什么?

代码使用循环从数据库中加载CartItem和Product。这非常慢,因为每个对象都需要另一个查询。这可以替换为生成单个SQL查询的一行。

如果CartItem具有ProductUser属性(正如它应该的那样),那么所有代码都可以替换为:

代码语言:javascript
运行
复制
var cart=_context.ShoppingCartItems
                 .Include(i=>i.Product)
                 .Where(s=>s.User.Email==userName)
                 .ToList();

EF将生成将用户、CartItem、products连接在一起的SQL查询,并返回项及其产品,但不返回User数据。Product数据可以通过CartItem.Product属性获得。

被问到但不应该使用的

如果绝对需要List<(CartItem,Product)> (为什么??)您可以使用它而不是List<Product>,并在循环中添加项:

代码语言:javascript
运行
复制
// PLEASE don't do it this way
var dontUseThis = new List<(CartItem,Product?)>();
foreach (var item in cart)
{
    var product=_context.Product.FirstOrDefault(x => x.id == item.ProductId);
    dontUseThis.Add((item,product));
}

这将导致每个购物车项增加一个SQL查询。

稍好于

一个稍微好一些的选项是生成一个WHERE product.ID IN (....)子句,在一个查询中加载所有相关产品。在此之后,这两个列表必须与JOIN相结合。

代码语言:javascript
运行
复制
var productIds=cart.Select(c=>c.ProductId);

var products=_context.Product
                     .Where(p=>productIds.Contains(p.Id))
                     .ToList();

var dontUseThis = products.Join(cart, 
                                p => p.Id, 
                                c => c.ProductId, 
                                (c, p) => (c,p))
                          .ToList();

这将将N+1查询减少到2。

票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74655545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档