您的位置:首页 > 其它

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

2014-12-17 10:37 447 查看
(1)  我的例子是,(Tb_Mnager)管理员表与(Tb_Role)角色表联查,返回两个表部分字段的组合

如下控制器代码:

[csharp] view
plaincopyprint?

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#反射的简单应用

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

[csharp] view
plaincopyprint?

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中遍历并读取值就简单多了:

[html] view
plaincopyprint?

@{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] view
plaincopyprint?

@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;" })
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  EF linq
相关文章推荐