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

現在のページだけが必要な場合は、LINQ クエリでSkipandを使用して、必要Takeな結果だけを取得する必要があります。

例えば:

 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 に答える