我有一个从数据库中检索数据并将其添加到列表中的函数。我的列表已准备好并显示数据,但我希望在该列表上进行分页,以便每页显示有限的记录。但不知道该怎么做。
这是我的数据层功能的代码。
public List<demodto> executereader(List<demodto> Ldemo,SqlCommand cmdshow, string tablename)
{
SqlConnection cn;
try
{
cn = this.getconnection();
cmdshow.Connection = cn;
cn.Open();
SqlDataReader rd = cmdshow.ExecuteReader();
while (rd.Read())
{
demodto dtoobj1 = new demodto();
dtoobj1.ID = Convert.ToInt32(rd[0].ToString());
dtoobj1.Name = rd[1].ToString();
dtoobj1.PhNo = Convert.ToInt32(rd[2].ToString());
dtoobj1.Address = rd[3].ToString();
dtoobj1.Gender = rd[4].ToString();
dtoobj1.Email = rd[5].ToString();
dtoobj1.Emptype = rd[6].ToString();
Ldemo.Add(dtoobj1);
}
cn.Close();
return Ldemo;
}
catch (Exception ex2)
{
throw new DataException("error....." + ex2.Message);
}
}
这适用于DTO课程。
public class demodto
{
public Int32 ID{get;set;}
public string Name{get;set;}
public Int32 PhNo { get; set; }
public string Address{get;set;}
public string Gender { get; set; }
public string Email { get; set; }
public string Emptype { get; set; }
}
请帮帮我。感谢。
答案 0 :(得分:26)
您可以使用LINQ分页列表,如下所示:
IList<demodto> GetPage(IList<demodto> list, int page, int pageSize) {
return list.Skip(page*pageSize).Take(pageSize).ToList();
}
例如,假设每个页面有50条记录。要获得第三页,请致电
IList<demodto> thirdPage = GetPage(dataList, 3, 50);
但请注意,将分页应用于内存中的数据毫无意义:分页背后的想法是减少从数据库中检索数据所需的时间,并通过仅保留一个内存来节省一些内存页面,在您的情况下不会发生,因为所有数据都会立即被检索。
为了使分页值得付出努力,您需要将其移动到数据库中。更改方法以接受页面大小和编号,并使用它们更改SQL以检索单个页面的列表。不要忘记在sql读取时强制排序,否则相同的数据可能会出现在不同的页面上。您的SQL需要修改以支持分页。根据您的数据库,这会有所不同。 MS SQL Server解决方案描述为in this answer。
答案 1 :(得分:0)
_context.skip(5).take(10)
尝试使用这个。这个问题的更好解释Paging with LINQ for objects
答案 2 :(得分:0)
Skip
和Take
扩展方法符合您的需求。我不知道您的网页结构如何,但您可以使用简单的for循环来获取这样的值:
int recordPerPage = 20;
for(int i=0; i<pageCount; i++)
{
var values = list.Skip(recordPerPage*i).Take(recordPerPage).ToList();
// add values to the page or display whatever..
}
答案 3 :(得分:0)
在新版本的 SQL Server 中,您可以使用 ROWNUMBER 函数
rowStart = ((Page - 1) * PageSize) + 1
rowEnd = Page * PageSize
SELECT * From (SELECT ROW_NUMBER() {0} As RowNum, * FROM table WHERE condition) AS RowConstrainedResult Where RowNum >= rowStart And RowNum <= rowEnd Order By RowNum
这会使整个过程变得更快,因为您不会带回整个数据集,而只是带回您想要的页面上的那些记录
答案 4 :(得分:0)
int pagesize = 1000;
int countitens = list1.Count();
int pagecount = countitens % pagesize <= 0 ? countitens / pagesize : (countitens / pagesize) + 1; // for example 10001 itens and page size of 1000 retusn 2 pages
for (int page = 0; page < pagecount; page++)
{
var itens = list1.Skip(page * pagesize).Take(pagesize).ToList();
}
或者只是
var itens = list1.Skip(page-1 * pagesize).Take(pagesize).ToList(); // page-1 if value of page start with 1