合并多个对象

Merge multiple objects

我遇到了一些问题。我正在创建一个网上商店,登录用户和未登录用户都可以在其中将产品添加到他们的购物车中。当用户结帐时,用户将必须登录或注册。如果用户登录现有帐户并且该帐户已经有一个包含产品的篮子,则必须将两个篮子合并为一个。下面是我的两个表 (BasketTable) 和 (BasketProductTable)。

public partial class BasketTable
    {
        public BasketTable()
        {
            this.BasketProductTables = new HashSet<BasketProductTable>();
            this.OrderTables = new HashSet<OrderTable>();
        }

        public int BasketId { get; set; }
        public Nullable<int> UserId { get; set; }
        public string SessionId { get; set; }
        public Nullable<System.DateTime> Registered { get; set; }

        public virtual ICollection<BasketProductTable> BasketProductTables { get; set; }
        public virtual UserTable UserTable { get; set; }
        public virtual ICollection<OrderTable> OrderTables { get; set; }
    }
public partial class BasketProductTable
    {
        public int BasketProductId { get; set; }
        public int BasketId { get; set; }
        public int ProductId { get; set; }
        public Nullable<int> Quantity { get; set; }
        public Nullable<double> TotalSum { get; set; }

        public virtual BasketTable BasketTable { get; set; }
        public virtual ProductTable ProductTable { get; set; }
    }

我的问题是我不确定如何合并篮子。如果有人可以将我导航到有关该主题的好文章或显示一些代码,那么我会很高兴。我在 Asp.Net (MVC) 中编码并使用 Linq to entity。 - 雅各布

----- 更新 ------ 我决定使用两个包含新旧篮子的 foreach。我检查了旧购物篮中是否存在新购物篮中的商品,然后我会用数量和总和更新它。如果它不存在,那么我会用它的信息创建一个新对象,然后删除旧的所有项目。我发现这些项目在运行时不会 created/updated 所以我在检查产品是否已在 foreach 中创建时遇到问题,所以我创建了一个列表,我将在其中添加 created/updated 产品productId 并检查代码是否在创建或更新之前将产品添加到列表中。我希望这对某人有所帮助。

我认为更好的体验是以忽略 "duplicated" 订单的方式合并购物篮。这是一些粗略的伪代码——类似于:

foreach (BasketProductTable newBasketProduct in newBasket.BasketProductTables) {
   if(oldBasket.Contains(newBasketProduct)) {
      continue; // this ignores duplicate order items
   }

   // Otherwise add it to the old basket
   oldBasket.Add(newBasketProduct);

}

其中,newBasketTable 是您新的商品篮子,oldBasket 是现有保存的篮子。

在此之后,您可以丢弃 "new basket",因为您的 "old basket" 有了新项目。提醒一句:不要忘记重新计算每件商品的价格,因为自用户上次将商品放入购物车后价格可能已经发生变化。