• LINQ体验(三)实现LINQ通用分页绑定方法


    在LINQ中,IQueryable <T>接口和IEnumerable <T>接口都分别提供了Skip方法和Take方法,用来做分页非常合适.因此我就想用他们做一个分页控件,因为IQueryable <T> 是继承自 IEnumerable <T> 的。因此使用接口仅需要针对后者就可以了。使用的时候只需提供数据源、绑定的GridView的、每页大小即可。现在问题就出了在数据源上,要求用户提供一个数据源类型,即IQueryable <T>接口和IEnumerable <T>接口? T是可确定类型(已知类型)的话还可以,若T是匿名类型,如 

    引用

    var list 
    = from it in de.Customers where it.City == "abc" select new { it.City, it.Country };  



      list的类型只有在运行时才能得到,怎么办呢!其实很简单我,我们可以使用 “参数推导泛型类型”的方法来实现: 

      看下面的代码(因为重点不在这里所以 代码写的比较粗糙): 

    C#代码  
    1.public void BindBoundControl<TSource>(IEnumerable<TSource> DataSource, GridView BoundControl, int PageSize)   
    2.        {   
    3.            //获取总记录数(这里可以使用参数传入总页数 就不必每次都执行下面方法)   
    4.            int totalRecordCount = DataSource.Count();   
    5.            //计算总页数   
    6.            int totalPageCount = 0;   
    7.            if (PageSize == 0)   
    8.            {   
    9.                PageSize = totalRecordCount;   
    10.            }   
    11.            if (totalRecordCount % PageSize == 0)   
    12.            {   
    13.                totalPageCount = totalRecordCount / PageSize;   
    14.            }   
    15.            else  
    16.            {   
    17.                totalPageCount = totalRecordCount / PageSize + 1;   
    18.            }   
    19.            //从参数中获取当前页码   
    20.            int CurrentPageIndex = 1;   
    21.            //如果从参数中获取页码不正确 设置页码为第一页   
    22.            if (!int.TryParse(HttpContext.Current.Request.QueryString["Page"], out CurrentPageIndex) || CurrentPageIndex <= 0 || CurrentPageIndex > totalPageCount)   
    23.            {   
    24.                CurrentPageIndex = 1;   
    25.            }   
    26.            //绑定数据源   
    27.            BoundControl.DataSource = DataSource.Skip((CurrentPageIndex - 1) * PageSize).Take(PageSize);   
    28.            BoundControl.DataBind();   
    29.        }  
    public void BindBoundControl<TSource>(IEnumerable<TSource> DataSource, GridView BoundControl, int PageSize)
            {
                
    //获取总记录数(这里可以使用参数传入总页数 就不必每次都执行下面方法)
                int totalRecordCount = DataSource.Count();
                
    //计算总页数
                int totalPageCount = 0;
                
    if (PageSize == 0)
                {
                    PageSize 
    = totalRecordCount;
                }
                
    if (totalRecordCount % PageSize == 0)
                {
                    totalPageCount 
    = totalRecordCount / PageSize;
                }
                
    else
                {
                    totalPageCount 
    = totalRecordCount / PageSize + 1;
                }
                
    //从参数中获取当前页码
                int CurrentPageIndex = 1;
                
    //如果从参数中获取页码不正确 设置页码为第一页
                if (!int.TryParse(HttpContext.Current.Request.QueryString["Page"], out CurrentPageIndex) || CurrentPageIndex <= 0 || CurrentPageIndex > totalPageCount)
                {
                    CurrentPageIndex 
    = 1;
                }
                
    //绑定数据源
                BoundControl.DataSource = DataSource.Skip((CurrentPageIndex - 1) * PageSize).Take(PageSize);
                BoundControl.DataBind();
            }

    调用 

    C#代码  
    1.protected void Page_Load(object sender, EventArgs e)   
    2.        {   
    3.            NorthwindEntities de = new NorthwindEntities();   
    4.            BindingUtils bind = new BindingUtils();   
    5.            //先排序与一下再绑定   
    6.            bind.BindBoundControl<Customers>(de.Customers.OrderBy(v=>v.CustomerID), this.GridView1, 10);     
    7.        }  
    protected void Page_Load(object sender, EventArgs e)
            {
                NorthwindEntities de 
    = new NorthwindEntities();
                BindingUtils bind 
    = new BindingUtils();
                
    //先排序与一下再绑定
                bind.BindBoundControl<Customers>(de.Customers.OrderBy(v=>v.CustomerID), this.GridView1, 10);  
            }

             

      下面我们只是需要重载一下我们的分页方法实现“参数推导泛型类型”就可以了 代码如下: 

    C#代码  
    1.        public void BindBoundControl<TSource>(IEnumerable<TSource> DataSource, TSource type, GridView BoundControl, int PageSize)   
    2.        {   
    3.            this.BindBoundControl(DataSource, BoundControl, PageSize);   
    4.        }  
            
    public void BindBoundControl<TSource>(IEnumerable<TSource> DataSource, TSource type, GridView BoundControl, int PageSize)
            {
                
    this.BindBoundControl(DataSource, BoundControl, PageSize);
            }




      调用 

    C#代码  
    1. protected void Page_Load(object sender, EventArgs e)   
    2.        {   
    3.            NorthwindEntities de = new NorthwindEntities();   
    4.            var list = from it in de.Customers where it.City == "abc" select new { it.City, it.Country };   
    5.            BindingUtils bind = new BindingUtils();   
    6.            bind.BindBoundControl(list.OrderBy(c=>c.City), list.FirstOrDefault(), this.GridView1, 10);     
    7.        }  
  • 相关阅读:
    原理Lambda表达式
    关于Web.config的debug和release.config文件
    利用GeoIP数据库及API进行地理定位查询 Java
    JSONP跨域的原理解析
    如何处理JSON中的特殊字符
    IIS下防止mdb数据库被下载的实现方法
    点击文字选中radio
    关于微信40029错误
    nopcommerce的WidgetZones
    js判断移动终端(手机浏览器)
  • 原文地址:https://www.cnblogs.com/pato/p/1971134.html
Copyright © 2020-2023  润新知