我們已經完成了訂單清單的畫面了,接著我們來處理資料庫的訂單資料。
我們先前在設計的時候將資料庫設計成表頭和表身兩個部分。
那我們今天先來將訂單資訊從資料庫取回來。
ProprietorModel.cs
Order.cs
Order.cs裡面存放我們的表頭與表身
public class Order
    {
        public Menulisth head { get; set; }
        public List<Menulistb> bodys { get; set; } = new List<Menulistb>();
    }
在ProprietorModel.cs 新增SelectOrder()的函式
public List<Order> SelectOrder(IConfiguration config)
    {
        var order_list = new List<Order>();
        //連線設定
        SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
        {
            //連線字串
            ConnectionString = config.GetValue<string>("WebmenuConnectionString"),
            DbType = DbType.SqlServer,//連線類型
            IsAutoCloseConnection = true //自動關閉連線
        });
        try
        {
            //當執行時,觸發事件
            db.Aop.OnLogExecuting = (sql, pars) =>
            {
                Console.WriteLine(sql);//查看SQL語法
            };
            //begin tran
            db.BeginTran();
            //取得菜單表頭,並排序(正序)
            var list_h = db.Queryable<Menulisth>().OrderBy(menu => menu.Createtime, OrderByType.Asc).ToList();
            var list_b = db.Queryable<Menulisth, Menulistb>((head, body) => new JoinQueryInfos(JoinType.Left, head.Uid == body.H_uid))
                .OrderBy(head => head.Createtime, OrderByType.Asc)
                .Select<Menulistb>().ToList();
            //將表頭加入到表身資料寫入
            foreach (var head in list_h)
            {
                var order = new Order();
                //加入表頭
                order.head = head;
                //加入表身
                foreach(var body in list_b)
                {
                    if(body.H_uid == head.Uid)
                    {
                        order.bodys.Add(body);
                    }
                }
                order_list.Add(order);
            }
            db.CommitTran();
        }
        catch
        {
            db.RollbackTran();//rollback
            throw;
        }
        return order_list;
    }
最後在寫到HomeController.cs測試一下能不能正常接收
public IActionResult Proprietor()
        {
            var proprietor = ProprietorModel.proprietor;
            var list = proprietor.SelectOrder(_config);
            foreach(var order in list)
            {
                Console.WriteLine("Uid:"+order.head.Uid);
                Console.WriteLine("FormNum:"+order.head.Formnum);
                Console.WriteLine("------------------------");
                foreach (var body in order.bodys)
                {
                    Console.WriteLine("Uid:" + body.Uid);
                    Console.WriteLine("H_Uid:" + body.H_uid);
                    Console.WriteLine("item:" + body.Item);
                    Console.WriteLine("==============================");
                }
            }
            return View();
        }
6.完成
可以先查看一下資料庫語法跟構想的有沒有一樣,還有輸出結果是否正確
有細心跟著做的小夥伴會發現,
其實我們資料庫的欄位還少一個狀態欄位。
用來判斷訂單是否完成。
之後我們在需要使用到的時候,除了會順便加上去這個欄位外,
還會順便介紹我們這樣設計模式的好處在哪。
var proprietor = ProprietorModel.proprietor;
出現錯誤,ProprietorModel內並沒有proprietor
這邊跟做CustomerModel的時候一樣,
做了Singleton Pattern的設計方式。
private static ProprietorModel mProprietor;
        /// <summary>
        /// 取得 ProprietorModel 物件
        /// </summary>
        public static ProprietorModel proprietor
        {
            get
            {
                if (mProprietor == null)
                {
                    mProprietor = new ProprietorModel();
                }
                return mProprietor;
            }
        }
(抱歉細節的部分沒有補上來)
var list_b = db.Queryable<Menulisth, Menulistb>((head, body) => new JoinQueryInfos(JoinType.Left, head.Uid == body.H_uid))
.OrderBy(head => head.Createtime, OrderByType.Asc)
.Select().ToList();
上述寫法,會造成list_b.Uid會填入list_h.Uid,造成後面Update資料時異常,我改寫成
var list_b = db.Queryable<Menulisth, Menulistb>((head, body) => new JoinQueryInfos(JoinType.Left, head.Uid == body.H_uid))
.OrderBy(head => head.Createtime, OrderByType.Asc)
.Select(head, body) => body).ToList();
增加指定頭身別名
sorry,這邊貼文上來的時候沒修正到。
這邊其實改一下順序就可以了。
var list_b = db.Queryable<Menulistb, Menulisth>((body, head) => new JoinQueryInfos(JoinType.Left, head.Uid == body.H_uid))
                    .Where((body, head) => head.Createtime >= DateTime.Today)
                    .OrderBy((body, head) => head.Createtime, OrderByType.Asc)
                    .Select<Menulistb>().ToList();
將 Menulistb、Menulisth順序反過來就OK了