Linq多表链接分页,Select new{"需要的字段列.."},配合杨涛Mvcpager,前台遍历展示自定义字段

来源:互联网 发布:知画生孩子第29集 编辑:程序博客网 时间:2024/05/20 05:11

(1)  我的例子是,(Tb_Mnager)管理员表与(Tb_Role)角色表联查,返回两个表部分字段的组合

如下控制器代码:

[csharp] view plaincopyprint?
  1. public ActionResult List(int? pager)  
  2. {  
  3.     pager = pager ?? 1;  
  4.     int pageSize =20;  
  5.     MyMvcCmsEntities db = new MyMvcCmsEntities();  
  6.     //多表链接查询,Select new{}返回需要的字段  
  7.     //注意此处,rs实际会是一个List<Object>对象,如何在视图中遍历???答:反射  
  8.     var rs = (from m in db.Tb_Manager  
  9.              join r in db.Tb_Role on m.roleId equals r.id orderby m.sequeNum descending  
  10.              select new  
  11.              {  
  12.                  m.id,  
  13.                  //自定义的状态,sql语句会转化为case..when..then  
  14.                  status = m.isDisable == 1 ? "<font color='red'>禁用</font>" : "<font color='green'>正常</font>",  
  15.                  m.loginName,  
  16.                  m.sequeNum,  
  17.                  m.date,  
  18.                  //角色表中的角色名字  
  19.                  r.roleName  
  20.              });  
  21.     //查询总数----sql事件探查器可知:此处会查询一次数据库  
  22.     ViewBag.allCount = rs.Count();  
  23.     //本语句会自动生成select top....,并把结果List<Object>返回----此处会查询一次数据库  
  24.     ViewBag.list = rs.ToPagedList((int)pager, pageSize);  
  25.     return View();  
  26. }  


(2)  好了,结果返回了,那么前台如何遍历遍历List<Object>的值呢?

答案:反射 详情 C#反射的简单应用

此处,我用反射原理,写了一个帮助类:

[csharp] view plaincopyprint?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Reflection;  
  5. using System.Text;  
  6. using System.Threading.Tasks;  
  7.   
  8. namespace Mvc.Util  
  9. {  
  10.    public class Reflection  
  11.    {  
  12.   
  13.        /// <summary>  
  14.        /// 获取指定属性的值(不区分大小写)  
  15.        /// </summary>  
  16.        /// <param name="PropertyName">属性名称</param>  
  17.        /// <param name="o">目标对象</param>  
  18.        /// <returns></returns>  
  19.        public static Object GetPropertyValueByName(string PropertyName, Object o)  
  20.        {  
  21.            if (o == null)  
  22.            {  
  23.                o = new { };  
  24.            }  
  25.            //创建一个返回对象  
  26.            Object returnObject = new Object();  
  27.            PropertyInfo[] p1 = o.GetType().GetProperties();  
  28.            foreach (PropertyInfo pi in p1)  
  29.            {  
  30.                if (pi.Name.ToLower() == PropertyName.ToLower())  
  31.                {  
  32.                    returnObject = pi.GetValue(o);  
  33.                }  
  34.            }  
  35.            return returnObject;  
  36.        }  
  37.   
  38.    }  
  39. }  

(3)  这就好办了,那么我们在视图View中遍历并读取值就简单多了:

[html] view plaincopyprint?
  1. @{int index = 0;}  
  2. @foreach (Object t in ViewBag.list)  
  3. {  
  4.     index++;  
  5.     <tr>  
  6.         <td align="center"><span class="checkall" style="vertical-align:middle;"><input class="list-box" value="@Reflection.GetPropertyValueByName("id", t).ToString()" type="checkbox" /></span></td>  
  7.         <td>@index</td>  
  8.         <td>@Reflection.GetPropertyValueByName("loginName", t).ToString()</td>  
  9.         <td>  
  10.             @Reflection.GetPropertyValueByName("roleName", t).ToString()  
  11.         </td>  
  12.         <td>@Reflection.GetPropertyValueByName("date", t).ToString()</td>  
  13.         <td>  
  14.             @Html.Raw(Reflection.GetPropertyValueByName("status", t).ToString())  
  15.         </td>  
  16.         <td>  
  17.             <input type="text" value="@Reflection.GetPropertyValueByName("sequeNum", t).ToString()" class="sort" />  
  18.         </td>  
  19.         <td align="center"><a href='@Url.Action("edit", "manager", new { area="cms",id=Reflection.GetPropertyValueByName("id", t).ToString()})'>修改</a></td>  
  20.     </tr>  
  21. }  


视图中分页代码,注意Html.Pager扩展方法第一个参数的类型为IPagedList:

[html] view plaincopyprint?
  1. @Html.Pager((IPagedList)ViewBag.list, new PagerOptions { PageIndexParameterName = "pager"ShowPageIndexBox = falsePageIndexBoxType = PageIndexBoxType.TextBox, ShowGoButton = falseFirstPageText = "首页"LastPageText = "尾页"ShowFirstLast = trueCurrentPagerItemWrapperFormatString = "<span class=\"current\">{0}</span>", CssClass = "default" }, new { @style = "width:100%;float=left;" })  
0 0