我們已經完成了訂單清單的畫面了,接著我們來處理資料庫的訂單資料。
我們先前在設計的時候將資料庫設計成表頭和表身兩個部分。
那我們今天先來將訂單資訊從資料庫取回來。
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了