iT邦幫忙

2021 iThome 鐵人賽

DAY 21
2
自我挑戰組

【Side Project】 系列 第 21

【Side Project】 訂單清單 - 取得訂單資訊

  • 分享至 

  • xImage
  •  

我們已經完成了訂單清單的畫面了,接著我們來處理資料庫的訂單資料。

取得資料庫資料

我們先前在設計的時候將資料庫設計成表頭表身兩個部分。
那我們今天先來將訂單資訊從資料庫取回來。

  1. api資料夾底下建立 ProprietorModel.cs
    https://ithelp.ithome.com.tw/upload/images/20211004/20115941MqohbWA8Mt.jpg
    與顧客點菜單的頁面一樣,我們製作一個Model負責幫我們處理資料的業務
  2. DTOClass資料夾底下創建Order.cs
  3. Order.cs裡面存放我們的表頭與表身
    https://ithelp.ithome.com.tw/upload/images/20211004/20115941J41q5QcS0a.jpg
public class Order
    {
        public Menulisth head { get; set; }
        public List<Menulistb> bodys { get; set; } = new List<Menulistb>();
    }
  1. 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;
        }
    
  2. 最後在寫到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.完成
https://ithelp.ithome.com.tw/upload/images/20211004/20115941l5HIQMREvx.jpg
可以先查看一下資料庫語法跟構想的有沒有一樣,還有輸出結果是否正確

結語

有細心跟著做的小夥伴會發現,
其實我們資料庫的欄位還少一個狀態欄位。
用來判斷訂單是否完成。
之後我們在需要使用到的時候,除了會順便加上去這個欄位外,
還會順便介紹我們這樣設計模式的好處在哪。


上一篇
【Side Project】 訂單清單 - 畫面設計2
下一篇
【Side Project】 訂單清單 - 資料庫新增狀態欄位
系列文
【Side Project】 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
衛斯理傳奇
iT邦新手 3 級 ‧ 2021-11-03 11:59:17

var proprietor = ProprietorModel.proprietor;

出現錯誤,ProprietorModel內並沒有proprietor

kyminjob iT邦新手 4 級 ‧ 2021-11-04 23:33:29 檢舉

這邊跟做CustomerModel的時候一樣,
做了Singleton Pattern的設計方式。

private static ProprietorModel mProprietor;
        /// <summary>
        /// 取得 ProprietorModel 物件
        /// </summary>
        public static ProprietorModel proprietor
        {

            get
            {
                if (mProprietor == null)
                {
                    mProprietor = new ProprietorModel();
                }
                return mProprietor;
            }
        }

(抱歉細節的部分沒有補上來)

0
衛斯理傳奇
iT邦新手 3 級 ‧ 2021-11-09 10:54:06

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();

增加指定頭身別名

kyminjob iT邦新手 4 級 ‧ 2021-11-09 16:54:27 檢舉

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了

我要留言

立即登入留言