2014-01-26 7 views
8

데이터베이스에서 데이터를 검색하여 목록에 추가하는 기능이 있습니다. 내 목록이 준비되어 있고 데이터를 보여 주지만 페이지 당 제한된 레코드가 표시되도록 해당 목록에 페이징을 원합니다. 어떻게하는지에 대해서는 전혀 모른다.
다음은이 데이터 계층 함수의 코드입니다. 목록에 페이징을 적용하는 방법

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

[개체에 대한 LINQ로 페이징] 가능한 중복 (http://stackoverflow.com/questions/2380413/paging-with-linq-for-objects) –

답변

17

IList<demodto> GetPage(IList<demodto> list, int page, int pageSize) { 
    return list.Skip(page*pageSize).Take(pageSize).ToList(); 
} 

예를 들어, 각 페이지 (50 개) 기록을 가지고 가정 : 당신은 페이지 같은 LINQ와 목록, 할 수있다. 세 번째 페이지를 보려면, 메모리에 데이터를 페이징을 적용하는 것은 거의 의미가 있다는 점

IList<demodto> thirdPage = GetPage(dataList, 3, 50); 

참고, 전화 : 페이징 뒤에 아이디어는 데이터베이스에서 데이터를 검색하는 데 걸리는 시간을 줄일 것입니다 모든 데이터가 한 번에 검색되기 때문에 자신의 경우에는 발생하지 않을 단일 페이지 만 유지하여 메모리를 절약 할 수 있습니다.

노력의 가치가있는 페이징을 만들려면 데이터베이스로 이동해야합니다. 메소드를 변경하여 페이지 크기와 숫자를 승인하고 SQL을 변경하여 단일 페이지의 목록을 검색하십시오. SQL 읽기를 강제로 수행하는 것을 잊지 마십시오. 그렇지 않으면 동일한 데이터가 다른 페이지에 나타날 수 있습니다. 페이지 매김을 지원하도록 SQL을 수정해야합니다. 이는 데이터베이스에 따라 다르게 수행됩니다. MS SQL Server 솔루션은 in this answer으로 설명됩니다.

+0

'return list.Skip (페이지 - 1 * pageSize) .Take (pageSize) .ToList();'? – Saket

+0

@Saket 그것은 '페이지'를 1- 기반인지 또는 0- 기반인지에 따라 다릅니다. 나는 0부터 시작하는 번호 매기기를 선호한다. – dasblinkenlight

+0

오케이. 정보 주셔서 감사합니다. – Saket

1

SkipTake 확장 방법에 더 나은 설명은 페이지의 구조 방법 needs.I 모르는 적합하지만 루프가 같은 값을 얻을 수 있도록 당신은 간단하게 사용할 수 있습니다

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.. 
} 
관련 문제