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

本文介绍如何利用LINQ的IQueryable与IEnumerable接口实现通用的分页控件。通过示例展示了如何处理匿名类型的数据源,并实现了参数推导泛型类型的分页方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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.        }  

转载于:https://www.cnblogs.com/pato/archive/2011/03/04/1971134.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值