当前位置:编程学习 > C#/ASP.NET >>

用LINQ实现分页控件的困惑!

在LINQ中,IQueryable<T>接口和IEnumerable<T>接口都分别提供了Skip方法和Take方法,用来做分页非常合适.因此我就想用他们做一个分页控件,使用的时候只需提供数据源、GridView的ID、每页大小和起始页标即可.现在问题就出了在数据源上,要求用户提供一个什么类型的数据源呢,DataSet? 这样就失去了LINQ的意义.IQueryable<T>接口和IEnumerable<T>接口? T是可确定类型(已知类型)的话还可以,若T是匿名类型,如
var names = from name in T.Customer
            where name.NameID > 20
            order by name.NameID
            select new {CName = name.Name,CNameID = name.NameID};
怎么在分页控件中保存数据源呢?即怎么在分页控件中保存names呢?
一直很困惑,渴望得到大家的帮助,先谢谢了! --------------------编程问答-------------------- 在线等待 --------------------编程问答-------------------- IQueryable <T> 是继承自 IEnumerable <T> 的。因此使用接口仅需要针对后者就可以了。 --------------------编程问答--------------------
引用楼主 andyzhaolin 的帖子:
如 
var names = from name in T.Customer 
            where name.NameID > 20 
            order by name.NameID 
            select new {CName = name.Name,CNameID = name.NameID}; 
怎么在分页控件中保存数据源呢?即怎么在分页控件中保存names呢? 


不太容易理解你问的问题是什么。

如果你已经假设name的逻辑,那么你应该用代码来说明这种逻辑。对于泛型,就是要加上约束。例如你的类型定义为:

public class MyControl<T> : DataPager where T:INamed  //INamed是你自己定义的接口描述那些有name属性的对象类
{

  public IEnumerable  <T>  theDataSource{get; set;}

  ......
} --------------------编程问答-------------------- 顶我的编程网吧
www.kingofcoders.com
编程王网站, N多文章 --------------------编程问答-------------------- 我的问题是:我写好了一个分页的用户控件Pager,使用的时候要求用户提供数据源、GridView的ID、每页大小和起始页标,后三项(GridView的ID、每页大小和起始页标)都很简单,就不说了.但就数据源这一问题,我一直很苦恼,我怎么保存用户提供的数据源呢?比如说,用户的数据源为
var names = from name in T.Customer  
            where name.NameID > 20  
            order by name.NameID  
            select new {CName = name.Name,CNameID = name.NameID};  

names,一个匿名类型,怎么在分页控件中保存数据源呢?即怎么在分页控件中保存names呢? 做数据分页的时候我要使用names.
请指点,谢谢! 
 

--------------------编程问答-------------------- 着急啊,请大家多多帮忙,先谢谢了! --------------------编程问答-------------------- 以下是我在一个人力资源系统中使用asppager控件的的分页查询方法:

   //根据条件取得符合条件的数据

  var result= from e in this.Ctx.Employees where (e.Status == EmployeeStatus.在职 && e.Deleted == false) select e; 

    //进行分页
   // query.PageIndex 当前页码
   //query.PageSize 每页显示的条数
    var result = result.Skip((query.PageIndex - 1) * query.PageSize).Take(query.PageSize);


完了· --------------------编程问答-------------------- to NeuMik:
谢谢你的示例,虽然并非我所想要的.
我困惑就困惑在怎么保存你所说的result上.
是先写好了一个分页控件,然后再使用,不是在一个页面下.问题就是怎么保存别人提供过来的result.
继续等待中…… --------------------编程问答-------------------- to NeuMik:
谢谢你的示例,虽然并非我所想要的.
我困惑就困惑在怎么保存你所说的result上.
是先写好了一个分页控件,然后再使用,不是在一个页面下.问题就是怎么保存别人提供过来的result.
继续等待中…… --------------------编程问答-------------------- 那位大哥能给写一个基于LINQ的分页控件则更佳,谢谢了!呵呵!要求提供源代码! --------------------编程问答-------------------- 不知道对你的说法理解的对不对,你是根据条件把所有的数据一下子取出来,作为数据源提供给分页控件保存的!
我想问你了,如果数据量是几百万或者更大,你这样做好吗?
不好意思,可能我理解错了!
不要见怪! --------------------编程问答-------------------- 关注中... ... --------------------编程问答-------------------- http://www.dazhixiao.cn/huati/asp.net/3600.html
我用LINQ做的简单分页用户控件。不知道能否帮上你的忙 --------------------编程问答-------------------- public class Type
{
   string CName;
   int CNameID;
}


var names = from name in T.Customer 
            where name.NameID > 20 
            order by name.NameID 
            select new Type
            {
               CName = name.Name,
               CNameID = name.NameID
            }; 
--------------------编程问答-------------------- 回帖是美德 --------------------编程问答--------------------
引用 14 楼 易做图870617 的回复:
public class Type 

  string CName; 
  int CNameID; 



var names = from name in T.Customer 
            where name.NameID > 20 
            order by name.NameID 
            select new Type 
            { 
              CName = name.Name, 
              CNameID = name.NameID 
            }; 

14楼正解
多加一句 List<Type> Type = names.ToList();
--------------------编程问答-------------------- 我也想遇到这个问题了!我补充一下问题 --------------------编程问答-------------------- 我也想遇到这个问题了!我补充一下问题:
例如:
gridview1.datasoure=from q in db.student select q;
gridview1.databind();
以上就可以直接把linq查询出来的数据源赋给gridview1.datasoure

但是我不知道怎么通过一个中间的变量保存我用linq查询出来的数据源,然后在把数据源赋给gridview1.datasoure。

如果高手知道请指教啊
qq:332453759

--------------------编程问答-------------------- IQueryable<XXX> FindAll()
{
   
}
XXX为一个实体类,你可以在实体类里定义FingAll方法里需要用的字段 --------------------编程问答-------------------- http://www.cnblogs.com/ejiyuan/archive/2009/12/22/1629806.html --------------------编程问答-------------------- 顶 --------------------编程问答--------------------

public IList<Model.Customer> GetCustomers(Query query)
{ IQueryable<Model.Customer> customers = FindCustomers();
//排序及分页
   return customers .OrderBy(t => t.NameID).Skip(query.PageIndex * query.PageSize).Take(query.PageSize).ToList();

}
public IQueryable<Model.Customer> FindCustomers()
        {
            return from c in T.Customer
            where c.NameID > 20
            order by c.NameID
            select new Model.Customer//Model层的Customer不同于数据实体
           {
            CName = c.Name,
            CNameID = c.NameID
           }; 
        }
--------------------编程问答-------------------- 如果实在需要将“数据源”保存,应该Save一个Compile好的查询。因为LinqToSQL使用延时加载,
执行完
var names = from n1 in x
            where ...
            select new { 
              CName=n1.name,
              CC = n1.cc
             };
后,names中仍未包含实际数据,所以将这个names“IQueryable”实例Compile一下,直接存放就可以了。
除非提供的接口是接收一个IList,IEnumerable等接口。


--------------------编程问答-------------------- 我现在也要用LINQ实现分页,在GridView控件中,怎样获得他的当前页呢?数据源是手动绑定的。
补充:.NET技术 ,  LINQ
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,