最近才接觸mvc,也是才接觸linq語法,還有EntiyFramework,個人感覺這種開發模式還是挺不錯的,隨手記點筆記,簡單做個增刪改查吧
一、實例化上下文ObjectContext:
引用空間那些就跳過了。。
db_testEntities test = new db_testEntities();
二、用linq語法從數據庫查詢數據:
使用linq語句查詢返回的數據類為IQueryable類型:
IQueryable<MvcTest.Models.T_UserInfo> list = from d in test.T_UserInfo select d;
奇怪的是,執行語句時,沒有返回數據,使用sql Server PRofiler跟蹤,并沒有對數據庫執行任何操作,網上資料說,是因為EF的延遲加載的緣故,EF具有的延遲加載和預先加載的事件,其利弊端還不是很明確,日后得好好學習,知道原因后,查詢數據代碼改為:
第一種方法:使用SQO標準查詢運算符查找所有數據列List<MvcTest.Models.T_UserInfo> list = test.T_UserInfo.ToList();第二種方法:使用linq語法查詢List<MvcTest.Models.T_UserInfo> list = (from d in test.T_UserInfo select d).ToList();
三、linq做個簡單的分頁查詢,方法如下:
#region 獲取分頁數據和數據條數 /// <summary> /// 獲取分頁數據和數據條數 /// </summary> /// <param name="pageIndex">當前頁</param> /// <param name="i">數據條數</param> /// <returns></returns> public IQueryable<T_UserInfo> GetPageLoad(int pageIndex, out int i) { IQueryable<T_UserInfo> list = (from d in test.T_UserInfo orderby d.Id select d).Skip<T_UserInfo>(5 * (pageIndex - 1))
.Take<T_UserInfo>(5); var count = from d in test.T_UserInfo select d; i = count.Count<T_UserInfo>();//記錄條數 return list; } #endregion
這里說明下:skip是在分頁在前有多少條數據,也就是在當前頁數據之前的數據總和,(跳過序列中指定數量的元素,然后返回剩余的元素。),下標是從零開始的
Take是指頁容量這里分為每頁顯示5條數據
四、獲取分頁數據并返回給視圖view:
#region 查找數據列表 /// <summary> /// 查找數據列表并分頁 /// </summary> /// <returns></returns> public int pageIndex=1; public ActionResult Index() { string pindex = Request.Params["index"]; int pi = string.IsNullOrEmpty(pindex) ? pageIndex : int.Parse(pindex); int s=0; ViewData["DataList"] = GetPageLoad(pi,out s); int dataCount = s; int pagecount = dataCount / 5;//數據頁數 pagecount =dataCount % 5 != 0 ? pagecount += 1 : pagecount; ViewBag.pageCount = pagecount;//頁數 ViewBag.dataCount = dataCount;//條數 ViewBag.pageindex =pi;//當前頁 return View(); } #endregion
View視圖代碼如下:
1 @using MvcTest.Models 2 @{ 3 Layout = null; 4 } 5 6 <!DOCTYPE html> 7 8 <html> 9 <head>10 <title>用戶列表</title>11 <style type="text/CSS">12 #tab13 {14 border:1px solid #0094ff;15 width:600px;16 margin:10px auto;17 border-collapse:collapse;18 }19 #tab th,td20 {21 border:1px solid #0094ff;22 padding:5px;23 }24 </style>25 <script type="text/javascript">26 function doDel(id)27 {28 if (confirm('你確定要刪除嗎?')) {29 window.location = "Dog/del/" + id;30 31 }32 }33 34 function page(sta, pageIndex, pageCount) {35 switch (sta) {36 case "index":37 38 window.location = "?index=1";39 break;40 case "prev":41 pageIndex = pageIndex > 1 ? parseInt(pageIndex - 1, 10) : pageIndex42 window.location = "?index=" + pageIndex;43 break;44 case "next":45 pageIndex = pageIndex < pageCount ? parseInt(pageIndex + 1, 10) : pageIndex;46 window.location = "?index=" + pageIndex;47 break;48 case "last":49 window.location = "?index="+pageCount;50 break;51 52 }53 }54 55 function pageSta(pageIndex, sta) { 56 switch(sta){}57 58 }59 </script>60 61 </head>62 <body>63 <div>64 @{ int i = 0;}65 <table id="tab">66 <tr><th>編號</th><th>用戶名</th><th>用戶類型</th><th>用戶性別</th><th>操作 <a href="Dog/Add">新增</a></th></tr>67 @foreach (T_UserInfo u in ViewData["DataList"] as IQueryable<T_UserInfo>)68 {69 i += 1;70 <tr align="center">71 <td>@i</td>72 <td>@u.UserName</td><td>@u.Name</td><td>@u.Gender</td>73 <td><a href="Dog/Edit/@u.Id">修改</a> 74 <a href="Javascript:doDel(@u.Id)">刪除</a></td>75 </tr>76 }77 <tr><td colspan="5" align="center">78 共有 @ViewBag.dataCount 條數據 當前 @ViewBag.pageIndex/ @ViewBag.pageCount 頁79 <a href="javascript:;" onclick="page('index',@ViewBag.pageIndex,@ViewBag.pageCount)">首頁</a> 80 <a href="javascript:;" onclick="page('prev',@ViewBag.pageIndex,@ViewBag.pageCount)">上一頁</a> 81 <a href="javascript:;" onclick="page('next',@ViewBag.pageIndex,@ViewBag.pageCount)">下一頁</a> 82 <a href="javascript:;" onclick="page('last',@ViewBag.pageIndex,@ViewBag.pageCount)">尾頁</a> 83 </td></tr>84 </table>85 86 </div>87 </body>88 </html>
本頁面包括增刪改操作,效果圖如下:
#region 添加數據 /// <summary> /// 添加數據 /// </summary> /// <param name="u"></param> /// <returns></returns> [HttpPost] public ActionResult Add(T_UserInfo u) {
//方法一: //T_UserInfo t = new T_UserInfo //{ // Name = u.Name, // UserName = u.UserName, // Gender = u.Gender, // PassWord = "123456" //}; ////獲取提交的數據放到實體中 //test.T_UserInfo.Attach(t); ////修改實體的狀態為添加 //test.ObjectStateManager.ChangeObjectState(t, System.Data.EntityState.Added); ////保存到數據庫 //test.SaveChanges();
//方法二:
ObjectSet<T_UserInfo> user = test.CreateObjectSet<T_UserInfo>(); var newUser= user.CreateObject(); newUser.Name = u.Name; newUser.UserName = u.UserName; newUser.Gender = u.Gender; newUser.PassWord ="123456"; user.AddObject(newUser); test.SaveChanges(); return RedirectToAction("Index", "Dog"); } #endregion
這里提供有兩種方法,其實獲取表單傳過來的數據,可以有好幾種方法,這里是傳入一個實體
前臺代碼如下:
1 @{ 2 Layout = null; 3 } 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <script src="../../Scripts/jquery.validate.min.js" type="text/javascript"></script> 8 <script src="../../Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script> 9 <title>添加用戶</title>10 <style type="text/css">11 #tab12 {13 border:1px solid #0094ff;14 width:600px;15 margin:10px auto;16 border-collapse:collapse;17 }18 #tab th,td19 {20 border:1px solid #0094ff;21 padding:5px;22 }23 </style>24 </head>25 <body>26 @*@using(Html.BeginForm("Add","Dog",FormMethod.Post)){*@27 <form id="from1" action="/Dog/Add" method="post">28 <table id="tab">29 <tr><td colspan="3" align="center">添加用戶</td></tr>30 <tr><td width="">用戶名</td><td><input name="username" /></td><td></td></tr>31 <tr><td>用戶類型</td><td><select name="name">32 <option value="管理員">管理員</option>33 <option value="用戶">用戶</option>34 <option value="普通會員">普通會員</option>35 </select></td><td></td></tr>36 <tr><td>性別</td><td>37 <select name="gender">38 <option value="男">男</option>39 <option value="女">女</option>40 </select>41 </td><td></td></tr>42 <tr><td colspan="3"><input type="submit" value="添加" /> <input type="button" value="取消" /></td></tr>43 </table>44 </form>45 @*}*@46 </body>47 </html>
六、刪除操作:
1 #region 刪除操作 2 /// <summary> 3 /// 刪除操作 4 /// </summary> 5 /// <param name="id"></param> 6 /// <returns></returns> 7 public ActionResult Del(int id) 8 { 9 try10 {11 //方法一:12 //創建要刪除的對象13 //T_UserInfo u = new T_UserInfo();14 //u.Id = id;15 //將對象存放到EF管理容器中16 //test.T_UserInfo.Attach(u);17 //將對像的狀態改為刪除狀態18 //test.T_UserInfo.DeleteObject(u);19 //更新到數據庫 20 // test.SaveChanges();21 //方法二:22 ObjectSet<T_UserInfo> t = test.CreateObjectSet<T_UserInfo>();23 T_UserInfo tu = t.Where("it.Id=@id", new ObjectParameter("id",id)).First();24 t.DeleteObject(tu);25 test.SaveChanges();26 return RedirectToAction("Index", "Dog");27 }28 catch (Exception ex)29 {30 31 return Content("刪除出錯" + ex.Message);32 }33 } 34 #endregion
同樣使用兩種方法都可行。
七、修改操作:
首先要顯示要修改的數據:
1 #region 顯示修改數據 2 public ActionResult Edit(int id) 3 { 4 //根據Id查找要修改的數據 5 T_UserInfo user = (from u in test.T_UserInfo where u.Id == id select u).FirstOrDefault(); 6 //將查詢到的數據返回給view viewBag,ViewData 7 //*可以再加載視圖時將數據傳給視圖上名為model的屬性 8 //下拉列表框 9 List<SelectListItem> list = new List<SelectListItem>() {10 new SelectListItem { Value = "管理員", Text = "管理員"},11 new SelectListItem { Value = "普通會員", Text = "普通會員"},12 new SelectListItem { Value = "用戶", Text = "用戶"}13 };14 //SelectListItem li = new SelectListItem { Value = "管理員", Text = "管理員"};15 ViewBag.select = list;16 return View(user);17 } 18 #endregion
接下來是修改:
1 #region 修改操作 2 /// <summary> 3 /// 修改操作 4 /// </summary> 5 /// <param name="u">實體類</param> 6 /// <returns></returns> 7 [HttpPost] 8 public ActionResult Edit(T_UserInfo u) 9 {10 try11 {12 //test.T_UserInfo.Attach(u);//將實體附加到實體上下文13 //手動修改實體的狀態14 //修改整個實體屬性15 //test.ObjectStateManager.ChangeObjectState(u,System.Data.EntityState.Modified);16 //保存回數據庫17 //***********************************************************************//18 //只修改相應屬性值19 T_UserInfo t = test.T_UserInfo.FirstOrDefault(a=>a.Id==u.Id);//找到實體20 if (t !=null)21 {22 t.Name = u.Name;//修改用戶類型23 t.UserName = u.UserName;//修改用戶名稱24 t.Gender = u.Gender;//修改性別25 test.SaveChanges();26 }27 return RedirectToAction("Index", "Dog");28 }29 catch (Exception ex)30 {31 32 return Content("修改失敗" + ex.Message);33 }34 } 35 #endregion
效果如下:
本人新菜鳥,如有不對的地方,歡迎大俠們指正,不喜勿噴。。
|
新聞熱點
疑難解答