0

我有一个业务层类,它使用 LINQ 将 IQueryable 数据返回到用户层中的 GridView。我希望它只返回一页数据;但是,它返回整个查询。我听说分页应该可以工作,但是每次翻页都会带回数百或数千行,并抛出除 pagesize 中设置的行之外的所有行。

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

2 回答 2

1

如果您只想要当前页面,您应该使用SkipTake在您的 LINQ 查询中获得您想要的结果。

例如:

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

这将只为您提供应在结果集中显示的项目,而不是其他任何项目。

查看以下文章,该文章将向您展示如何更详细地进行设置:

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

于 2011-03-21T22:34:50.197 回答
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();
    }
于 2011-03-22T17:15:02.913 回答