2011-03-21 2 views
0

LINQ를 사용하여 IQueryable 데이터를 사용자 계층의 GridView로 반환하는 비즈니스 계층 클래스가 있습니다. 나는 그것이 단지 한 페이지의 데이터 만 반환하기를 원한다. 그러나 전체 쿼리를 반환하고 있습니다. 페이징이 제대로 작동한다고 들었지만, 모든 페이지가 돌아 오면 수백 또는 수천 개의 행을 가져오고 페이지 크기로 설정된 행을 제외하고 모두 버립니다. 여기 IQueryable에 연결된 Gridview LINQ 쿼리가 단일 페이지 대신 전체 쿼리를 반환합니다.

<asp:GridView ID="grdMatches" runat="server" AutoGenerateColumns="false" CssClass="gridview" 
    AlternatingRowStyle-CssClass="even" AllowPaging="true" AllowSorting="true" PageSize="10" 
    DataKeyNames="Id" OnPageIndexChanging="grdMatches_PageIndexChanging" OnSorting="grdMatches_Sorting" 
    AutoGenerateSelectButton="True" OnSelectedIndexChanging="grdMatches_SelectedIndexChanging"> 
    <Columns> 
     <asp:BoundField DataField="PAQNumber" HeaderText="PAQ #" SortExpression="PAQNumber" /> 
     <asp:BoundField DataField="ScoredNumber" HeaderText="Score #" SortExpression="ScoredNumber" /> 
     <asp:BoundField DataField="CustomerId" HeaderText="Cust #" SortExpression="CustomerId" /> 
     <asp:BoundField DataField="Customer" HeaderText="Customer" SortExpression="Customer" /> 
     <asp:BoundField DataField="Department" HeaderText="Department" SortExpression="Department" /> 
     <asp:BoundField DataField="DOTNumber" HeaderText="DOT #" SortExpression="DOTNumber" /> 
     <asp:CheckBoxField DataField="OrgNameMatch" HeaderText="Org Match" /> 
     <asp:CheckBoxField DataField="JobTitleMatch" HeaderText="Job Match" /> 
     <asp:CheckBoxField DataField="IncumbentNameMatch" HeaderText="Inc Match" /> 
    </Columns> 
</asp:GridView> 

가있는 gridview를로드하는 코드입니다 : 여기

는 LINQ 쿼리입니다 (아래로 편집 약간) 여기

 public IQueryable<ScoredMatch> List() 
    { 
     var dc = new PAQcDataLayerDataContext(); 
     var matches = (
      from m in dc.ScoredRecordMatches 
      join c in dc.Customers on m.CustomerId equals c.CustomerId 
      orderby m.PAQNumber 
      select new ScoredMatch() 
      { 
       Id = m.Id, 
       PAQId = (int)m.PAQId, 
       PAQVersion = (int)m.PAQVersion, 
       JobTitleMatch = (bool)m.JobTitleMatch, 
       OrgNameMatch = (bool)m.OrgNameMatch, 
       IncumbentNameMatch = (bool)m.IncumbentNameMatch, 
      }); 

     return matches; 
    } 

그리고는의 GridView입니다

grdMatches.DataSource = new ScoredMatch().List(); 
grdMatches.DataBind(); 

그리고 페이징을 수행하는 코드는 다음과 같습니다.

protected void grdMatches_PageIndexChanging(object sender, GridViewPageEventArgs e) 
    { 
     grdMatches.DataSource = new ScoredMatch().List(); 
     grdMatches.PageIndex = e.NewPageIndex; 
     grdMatches.DataBind(); 
    } 

답변

1

현재 페이지를 원할 경우 LINQ 쿼리에 SkipTake을 사용해야 원하는 결과 만 얻을 수 있습니다.

예는 :

yourQuery.Skip((currentPage - 1) * pageSize).Take(pageSize).Select(.... 

이 당신에게 당신의 결과 세트와 아무것도에 표시되어야 단지 항목을 제공 할 것입니다. 어떻게 더 자세하게 모든 설정이 표시됩니다 다음 문서 밖으로

확인 :

http://www.dbtutorials.com/display/linq-to-sql-paging-cs.aspx

+0

내가있는 gridview가 자기의 모든 페이징 처리하도록 설정 될 수 있다고 생각? –

+0

@ 닉 그것은 할 수 있지만 당신은 그냥 필터링 할 원시 목록에 연결할 수 없다고 생각합니다 (내가 틀릴 수도). – Kelsey

+0

@ Kelsey의 .Skip/.Take 방식을 사용하려면 모든 쿼리에 PageSize 및 CurrentPage를 추가해야합니다. @ 닉 & 내가 용의자로, Linq이 알아낼 정도로 똑똑하다면, 어떻게 배우고 싶습니다. –

0
protected void grdMatches_PageIndexChanging(object sender, GridViewPageEventArgs e) 
    { 
     // not sure where to get "pageSize" with a grid view but would assume it is there someplace. 
     grdMatches.DataSource = new ScoredMatch() 
      .Skip(e.NewPageIndex * pageSize) 
      .Take(pageSize) 
      .List(); 

     grdMatches.PageIndex = e.NewPageIndex; 
     grdMatches.DataBind(); 
    } 
+0

@Andy Robinson의 접근 방식은 언뜻보기에 좋지만 데이터의 초기로드는 "PageSize"행만 가져오고 결과적으로 GridView는 페이지의 데이터가 하나만 있다고 판단하고 페이징을 켭니다. –