合并多个对象

时间:2016-03-14 23:39:48

标签: c# asp.net-mvc linq-to-entities

我遇到了一些我遇到的问题。我正在创建一个网上商店,登录和未登录的用户可以将产品添加到他们的购物篮中。当用户checkeouts时,用户必须登录或注册。如果用户登录现有帐户并且该帐户已经有产品篮子,则必须将两个篮子合并为一个。下面是我的两个表(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实体。 - 雅各布

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

1 个答案:

答案 0 :(得分:0)

我认为更好的体验是以这样的方式合并篮子,即忽略“重复”的订单。这是一些粗略的伪代码 - 类似于:

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是现有已保存的购物篮。

在此之后,您可以丢弃“新篮子”,因为您的“旧篮子”有新项目。需要注意的是:不要忘记重新计算每件商品的价格,因为自用户上次将商品放入购物篮中以来价格可能已经发生变化。