Gridview, привязанный к запросу IQueryable LINQ, возвращает весь запрос вместо одной страницы - PullRequest
0 голосов
/ 22 марта 2011

У меня есть класс бизнес-уровня, который использует LINQ для возврата данных IQueryable в 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:

<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:

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();
    }

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Если вам нужна текущая страница, вы должны использовать Skip и Take в запросе LINQ, чтобы получить только те результаты, которые вам нужны.

Например:

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

Thisдаст вам только элементы, которые должны отображаться в вашем наборе результатов и ничего больше.

Ознакомьтесь со следующей статьей, которая покажет вам, как настроить все это более подробно:

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

0 голосов
/ 22 марта 2011
    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();
    }
...