如何在EF Core中通过外键获取VAT并计算订单税额
解决订单VAT税额计算问题
问题背景
已定义Product模型和包含Vat字段的Category模型(通过CategoryId外键关联),在计算订单总额时需要获取每个产品对应的VAT值,进而计算含VAT的订单总额,但当前代码无法获取到VAT数据。
相关模型代码
Product模型
public class Product { [Key] public int Id { get; set; } [Required] public string Title { get; set; }/*Product name english*/ public string? TitleAr { get; set; }/*Product name english*/ public string Description { get; set; } [Required] public string SKU { get; set; } /*ISBN*/ [Required] public string SupplierName { get; set; } /*Productname*/ [Required] [Display(Name ="List Price")] [Range(0,1000)] public double ListPrice { get; set; } [Required] [Display(Name = "Price for 1-50")] [Range(0, 1000)] public double Price { get; set; } [Required] [Display(Name = "Price for 50+")] [Range(0, 1000)] public double Price50 { get; set; } [Required] [Display(Name = "Price for 100+")] [Range(0, 1000)] public double Price100 { get; set; } public int CategoryId { get; set; } [ForeignKey("CategoryId")] [ValidateNever] public Category Category { get; set; } [ValidateNever] public List<ProductImage> ProductImages { get; set; } }
Category模型
public class Category { [Key] public int Id { get; set; } [Required] [MaxLength(30)] [DisplayName("Category Name")] public string Name { get; set; } /*English name*/ public string? NameAr { get; set; } [DisplayName("Display Order")] [Range(1,100)] public int DisplayOrder { get; set; } public int Vat { get; set; } }
解决方案
1. 关联加载Category数据
当前获取购物车列表时仅加载了Product,需要修改includeProperties参数,同时加载Product关联的Category:
var claimsIdentity = (ClaimsIdentity)User.Identity; var userId = claimsIdentity.FindFirst(ClaimTypes.NameIdentifier).Value; ShoppingCartVM = new() { ShoppingCartList = _unitOfWork.ShoppingCart.GetAll(u => u.ApplicationUserId == userId, includeProperties: "Product,Product.Category"), // 新增Product.Category关联加载 OrderHeader = new() };
2. 修改订单总额计算逻辑
在循环中获取产品对应的VAT税率,计算税额后累加含VAT的金额:
foreach (var cart in ShoppingCartVM.ShoppingCartList) { cart.Price = GetPriceBasedOnQuantity(cart); double itemSubtotal = cart.Price * cart.Count; // 计算VAT税额:注意Vat是整数(如15代表15%),需转成百分比小数 double itemVat = itemSubtotal * (cart.Product.Category.Vat / 100.0); // 累加含VAT的小计到订单总额 ShoppingCartVM.OrderHeader.OrderTotal += itemSubtotal + itemVat; // 可选:如果需要单独记录总税额,可给OrderHeader添加VatTotal字段后累加 // ShoppingCartVM.OrderHeader.VatTotal += itemVat; } return View(ShoppingCartVM);
辅助方法保持不变
private double GetPriceBasedOnQuantity(ShoppingCart shoppingCart) { if (shoppingCart.Count <= 50) { return shoppingCart.Product.Price; } else if (shoppingCart.Count <= 100) { return shoppingCart.Product.Price50; } else { return shoppingCart.Product.Price100; } }
说明
- 确保
Category模型中的Vat字段存储的是百分比数值(如15表示15%的税率) - 计算时需将整数类型的VAT值除以
100.0转成浮点型,避免整数除法导致精度丢失 - 若需单独展示税额,可在
OrderHeader模型中添加VatTotal字段,专门记录订单总税额
内容的提问来源于stack exchange,提问作者Abdulaziz Alqasem
相关产品推荐
相关产品推荐

