Linq多表鏈接分頁,Select new{"需要的字段列.."},配合楊濤Mvcpager,前臺遍歷展示自定義字段

    CSDN廣告是越來越多了,所有博客筆記不再更新,新網址 DotNet筆記

題前:,Select new{"需要的字段列.."}好處,減少不必要數據的查詢,尤其是分佈式的時候,網絡再不好的情況下,而不必要的數據又很多,Select new{"需要的字段列.."}好處明顯

如題,Linq多表鏈接分頁,Select new{"需要的字段列.."},配合楊濤Mvcpager,前臺遍歷展示自定義字段


(1)  我的例子是,(Tb_Mnager)管理員表與(Tb_Role)角色表聯查,返回兩個表部分字段的組合

如下控制器代碼:

        public ActionResult List(int? pager)
        {
            pager = pager ?? 1;
            int pageSize =20;
            MyMvcCmsEntities db = new MyMvcCmsEntities();
            //多表鏈接查詢,Select new{}返回需要的字段
            //注意此處,rs實際會是一個List<Object>對象,如何在視圖中遍歷???答:反射
            var rs = (from m in db.Tb_Manager
                     join r in db.Tb_Role on m.roleId equals r.id orderby m.sequeNum descending
                     select new
                     {
                         m.id,
                         //自定義的狀態,sql語句會轉化爲case..when..then
                         status = m.isDisable == 1 ? "<font color='red'>禁用</font>" : "<font color='green'>正常</font>",
                         m.loginName,
                         m.sequeNum,
                         m.date,
                         //角色表中的角色名字
                         r.roleName
                     });
            //查詢總數----sql事件探查器可知:此處會查詢一次數據庫
            ViewBag.allCount = rs.Count();
            //本語句會自動生成select top....,並把結果List<Object>返回----此處會查詢二次數據庫
            ViewBag.list = rs.ToPagedList((int)pager, pageSize);
            return View();
        }


(2)  好了,結果返回了,那麼前臺如何遍歷遍歷List<Object>的值呢?

答案:反射 詳情 C#反射的簡單應用   【注意】:.net4.0建議使用dynamic代替反射

此處,我用反射原理,寫了一個幫助類:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace Mvc.Util
{
   public class Reflection
   {

       /// <summary>
       /// 獲取指定屬性的值(不區分大小寫)
       /// </summary>
       /// <param name="PropertyName">屬性名稱</param>
       /// <param name="o">目標對象</param>
       /// <returns></returns>
       public static Object GetPropertyValueByName(string PropertyName, Object o)
       {
           if (o == null)
           {
               o = new { };
           }
           //創建一個返回對象
           Object returnObject = new Object();
           PropertyInfo[] p1 = o.GetType().GetProperties();
           foreach (PropertyInfo pi in p1)
           {
               if (pi.Name.ToLower() == PropertyName.ToLower())
               {
                   returnObject = pi.GetValue(o);
               }
           }
           return returnObject;
       }

   }
}

(3)  這就好辦了,那麼我們在視圖View中遍歷並讀取值就簡單多了:

            @{int index = 0;}
            @foreach (Object t in ViewBag.list)
            {
                index++;
                <tr>
                    <td align="center"><span class="checkall" style="vertical-align:middle;"><input class="list-box" value="@Reflection.GetPropertyValueByName("id", t).ToString()" type="checkbox" /></span></td>
                    <td>@index</td>
                    <td>@Reflection.GetPropertyValueByName("loginName", t).ToString()</td>
                    <td>
                        @Reflection.GetPropertyValueByName("roleName", t).ToString()
                    </td>
                    <td>@Reflection.GetPropertyValueByName("date", t).ToString()</td>
                    <td>
                        @Html.Raw(Reflection.GetPropertyValueByName("status", t).ToString())
                    </td>
                    <td>
                        <input type="text" value="@Reflection.GetPropertyValueByName("sequeNum", t).ToString()" class="sort" />
                    </td>
                    <td align="center"><a href='@Url.Action("edit", "manager", new { area="cms",id=Reflection.GetPropertyValueByName("id", t).ToString()})'>修改</a></td>
                </tr>
            }


視圖中分頁代碼,注意Html.Pager擴展方法第一個參數的類型爲IPagedList:

 @Html.Pager((IPagedList)ViewBag.list, new PagerOptions { PageIndexParameterName = "pager", ShowPageIndexBox = false, PageIndexBoxType = PageIndexBoxType.TextBox, ShowGoButton = false, FirstPageText = "首頁", LastPageText = "尾頁", ShowFirstLast = true, CurrentPagerItemWrapperFormatString = "<span class=\"current\">{0}</span>", CssClass = "default" }, new { @style = "width:100%;float=left;" })



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章