合并多个对象
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" 有了新项目。提醒一句:不要忘记重新计算每件商品的价格,因为自用户上次将商品放入购物车后价格可能已经发生变化。
我遇到了一些问题。我正在创建一个网上商店,登录用户和未登录用户都可以在其中将产品添加到他们的购物车中。当用户结帐时,用户将必须登录或注册。如果用户登录现有帐户并且该帐户已经有一个包含产品的篮子,则必须将两个篮子合并为一个。下面是我的两个表 (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" 有了新项目。提醒一句:不要忘记重新计算每件商品的价格,因为自用户上次将商品放入购物车后价格可能已经发生变化。