【问题标题】:How to calculate total cost如何计算总成本
【发布时间】:2018-02-27 15:41:01
【问题描述】:

我正在尝试使用 MVC 5 通过 Entity Framework 6 Code First 构建我的第一个应用程序,但我有一个问题,我的应用程序是包含 Items 类的在线餐厅,它包含 itemprice 和 itemamount,我想计算它的值 itemprice *itemamount 要保存在 Orders 类的总成本中,我如何在初始化程序中做到这一点[在此处输入图像描述][1]???

var Items = new List<MenuItem>
     {
         new MenuItem { ItemName = "Cheese Piza", Itemdesrciption="Pizza with cheese", MenuID=int.Parse("3"), ItemPrice=Decimal.Parse("15.5"), ItemAmount=int.Parse("2")},
         new MenuItem { ItemName = "Bolinez Pasta", Itemdesrciption="pasta with red sous", MenuID=int.Parse("3"),ItemPrice=Decimal.Parse("20.45"), ItemAmount=int.Parse("3")},
         new MenuItem { ItemName = "Holy Cake", Itemdesrciption="Cake with choklet sous", MenuID=int.Parse("3"), ItemPrice=Decimal.Parse("45.5"), ItemAmount=int.Parse("1")},
     };

     Items.ForEach(I => context.Item.Add(I));
        context.SaveChanges();




        var Orderss = new List<Order>
     {
         new Order { CustomerID = int.Parse("1"), ItemID=int.Parse("3"), OrderDate= DateTime.Parse("2005-09-01"),
             TotalPrice = },

     };

【问题讨论】:

  • 图片不可用,请更新您的答案以显示图片链接
  • 除非您对总成本的计算经常变化,否则我不会节省成本。只需在需要时计算即可。然后,您可以在需要成本时使用 get 访问器执行计算。 docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
  • .. 你为什么使用MenuID=int.Parse("3") 而不是MenuID=3
  • 我以为不行
  • 它会工作的。您只是使用 int.Parse 将“3”更改为 3。我可能会尝试更多地关注基本的 C# 内容,然后尝试理解 MVC 5 和 EF 内容。

标签: c# entity-framework-6 code-first


【解决方案1】:

我觉得数据没必要存到数据库,因为是计算字段,我觉得你可以给我们看看你的数据库的模型,观察你的逻辑,有点像master detail,老师在哪里可以是一个“订单”表,该表详细说明了该“订单详细信息”订单的项目以及可用项目“项目”的另一个表。

    namespace Model
{

    public class Order
    {
        public int Id { get; set; }

        public int CustomerId { get; set; }

        [ForeignKey( "CustomerId" )]
        public virtual Customer Customer { get; set; }

        public virtual List<OrderDetail> Details { get; private set; }

        public double Total { get { return Details.Sum( t => t.SubTotal ); } }

        public Order()
        {
            this.Details = new List<OrderDetail>();
        }
    }

    public class OrderDetail
    {
        public int Id { get; set; }
        public int OrderId { get; set; }
        public virtual Order Order { get; set; }

        public int ItemId { get; set; }

        [ForeignKey( "ItemId" )]
        public virtual Item Item { get; set; }

        public int Quantity { get; set; }

        public double SubTotal { get { return this.Item.Price * this.Quantity; } }
    }

    public class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public double Price { get; set; }
        public double Cost { get; set; }
    }
}

namespace Try
{
    public class Program
    {
        public static void Main()
        {
            using (DataBaseContext context = new DataBaseContext())
            {
                context.Items.AddOrUpdate( t => t.Name, 
                    new Model.Item() { Name = "MyProduct1", Price= 14.5, Cost=11.5, Description="" } ,
                    new Model.Item() { Name = "MyProduct2", Price = 16.5, Cost = 14.5, Description = "" },
                    new Model.Item() { Name = "MyProduct3", Price = 20.5, Cost = 18.5, Description = "" },
                    new Model.Item() { Name = "MyProduct4", Price = 10.5, Cost = 8.5, Description = "" }
                    );

                context.Savechanges();


                Model.Order Order= new Model.Order() { CustomerId=3};

                Order.Details.AddRange( new Model.OrderDetail[] {
                new Model.OrderDetail {  ItemId= 1, Quantity=2},
                new Model.OrderDetail {  ItemId= 2, Quantity=1},
                new Model.OrderDetail {  ItemId= 3, Quantity=5},
                new Model.OrderDetail {  ItemId= 4, Quantity=6}
                } );

                Console.WriteLine( "Total: {0} for {1} Items", Order.Total, Order.Details.Count );
                Console.ReadLine();
            }               

        }
    }
}

请启用 Lazy 以自动加载导航属性。

【讨论】:

    【解决方案2】:

    您可以使用计算属性添加计算列。这应该创建一个在数据库中计算的价格列。设置私有集是为了使程序无法覆盖数据库提供的计算。

    public class MenuItem 
    {
        [Key]
        public Int MenuID{ get; set; }
        public string ItemName { get; set; }
        public string Itemdesrciption { get; set; }
        public Int ItemAmount{ get; set; }
    
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)]      
        public string ItemPrice
        {
            get { return /* do your sum here */ }
            private set { /* needed for EF */ }
        }
    }
    

    【讨论】:

      【解决方案3】:

      只需使用var price = Items.Sum(t =&gt; t.ItemPrice); 但是,我想你必须在这段代码上工作很多:)

      关于 int.parse read this

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-14
        • 2022-12-02
        • 1970-01-01
        相关资源
        最近更新 更多