我正在使用MVC创建ASP.NET购物车。
我的商店权利包含一个篮子的DBSet。我的购物篮模型,包含一个BasketItems列表。问题是,我的" AddtoBasket"功能,需要搜索当前的BasketItem列表,并确定是否有相同的" basketitem"已存在,如果存在,请增加数量。我在购物车逻辑上走到了尽头。我究竟如何搜索我目前的" basketItems" ?
商店背景
public class StoreEntities : DbContext
{
public DbSet<Order> Order { get; set; }
public DbSet<OrderItems> OrderItems {get; set;}
public DbSet<Basket> Basket { get; set; }
public dbSet<BaskItem> BasketItems {get; set; }
}
模型
public class BasketItem
{
[Key]
public int BasketItemID { get; set; }
public string sellerID { get; set; }
public string sku { get; set; }
public int Quantity { get; set; }
public decimal Price { get; set; }
}
public class Basket
{
[Key]
public string BasketID { get; set; }
public virtual List<BasketItem> BasketItems { get; set; }
public System.DateTime DateCreated { get; set; }
}
购物车逻辑
public void AddtoBasket(BasketItem basketItem)
{
//Search Current Basket for basketItem
//
//If item doesnt exists, add it
if (basketItem == null){
basketItem = new BasketItem
{
sku = "",
sellerID = "",
Quantity = 1,
Price = 100
};
storeDB.BasketItems.Add(basketItem);
storeDB.SaveChanges();
}
else
{
basketItem.Quantity = +basketItem.Quantity;
storeDB.SaveChanges();
}
}
#endregion
答案 0 :(得分:1)
好吧,我猜你收到的篮子项目没有BasketItemID(因为它是关键,你可能会得到它的默认值)。这里的关键问题是你如何定义&#34;已经存在&#34;。为了论证,我将假设sellId(请为您的属性遵循PascalCase,这通常是属性名称的公认约定)和sku(无论是什么)需要相等。所以在当前案例中这样做的显而易见的方法是:
var basketItem = <yourCurrentBasket>.BasketItems.
Where(bi => bi.sellerId == basketItem.sellerID && bi.sku == basketItem.sku);
现在,您会注意到我没有说明您将如何取回当前的购物篮。那是因为这是一个架构决策,至少从你提供的内容来看,我没有看到你实现它。进行查找的最佳方法是让您能够按用户查找购物篮(这意味着向UserId
类添加Basket
(无论您的唯一用户标识符是什么)。是否实现了具有两个或多个活动篮子的用户的功能一次取决于您的使用案例和要求 - 您应该适当地处理它。
根据我(以及许多其他人),存储用户ID /任何其他唯一标识符的最佳位置是Session
(根据您的身份验证模式,您可能有其他选项:
see this topic for more details
)
然后,查找变得如此简单(如果每个用户只有1个活动篮子 - 处理多篮子情况并不复杂得多):
public class Basket
{
[Key]
public string BasketID { get; set; }
public virtual List<BasketItem> BasketItems { get; set; }
public System.DateTime DateCreated { get; set; }
public Guid UserId { get; set; }
}
...
var basketItem = storeDb.Basket.Where(basket => basket.UserId == currentUserId)
.Include(basket => basket.BasketItems ).Where(bi => bi.sellerId == basketItem.sellerID && bi.sku == basketItem.sku);