我遇到了一些我遇到的问题。我正在创建一个网上商店,登录和未登录的用户可以将产品添加到他们的购物篮中。当用户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上添加创建/更新的产品如果在创建或更新之前将产品添加到列表中,请检入代码。我希望这有助于某人。
答案 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是现有已保存的购物篮。
在此之后,您可以丢弃“新篮子”,因为您的“旧篮子”有新项目。需要注意的是:不要忘记重新计算每件商品的价格,因为自用户上次将商品放入购物篮中以来价格可能已经发生变化。