protected CartItem AddToCart(ProductDetails product, double quantity, double?price = null)
        {
            var cartItems = HttpContext.GetCartItems();
            var res       = cartItems.ToLookup(ci => ci.ProductDetails, ci => ci, ProductDetails.PhysicalComparer)[product].ToList();

            if (res.Count > 0)
            {
                var item = res[0];
                item.Quantity += quantity;
                DbSession.SaveOrUpdate(item);
                return(item);
            }
            else
            {
                var item = new CartItem();
                item.AppId          = WebGlobal.AppId;
                item.SessionID      = WebGlobal.GetSessionCookie(System.Web.HttpContext.Current);
                item.Name           = product.Name;
                item.Price          = price ?? product.SellingPrice ?? 0D;
                item.ProductDetails = product;
                item.Quantity       = quantity;
                DbSession.SaveOrUpdate(item);
                HttpContext.ResetCartCount();
                return(item);
            }
        }
        public static IList <CartItem> GetCartItems(this HttpContext context)
        {
            var cusid = context.GetCustomerId() ?? Guid.Empty;
            var si    = WebGlobal.GetSessionCookie(context);

            return(context.GetDbSession()
                   .CreateQuery(@"select distinct ci 
                               from CartItem as ci 
                               left join fetch ci.ProductDetails 
                               where ci.AppId = :appid and (ci.Customer.ID = :cusid or ci.SessionID = :si) 
                               order by ci.DateCreated")
                   .SetParameter("appid", WebGlobal.AppId)
                   .SetParameter("si", si)
                   .SetParameter("cusid", cusid)
                   .SetCacheable(true)
                   .SetCacheMode(CacheMode.Normal)
                   .List <CartItem>());
        }