0

EntityDataSource からページ化された ASP.NET ListView にデータをバインドするページがあります。クエリは実際にはかなり複雑なクエリであり、EDS が実際に適しているかどうかはわかりませんが、これは継承されたコードであり、ページを完全に再設計することなくこの問題を解決したいと考えています。

問題は、フィルター パラメーターを使用してページがポストバックされると、クエリがフィルターなしで 1 回実行され、フィルターを使用してもう一度実行されることです。問題は、フィルター処理されていない結果セットが 1,700 万件以上のレコードであり、要求がタイムアウトになることです。

だから私の質問は...

  1. クエリが 2 回実行されるのはなぜですか? ListView の DataPager と関係があるのではないかと思いましたが、ページから削除しても何も変わりませんでした。

更新:2013/04/16

@bUKaneer と @lthibodeaux に感謝します。リクエスト情報をOPに追加すると役立つと思いました。

提案どおり、Pager コントロールとリスト ビューをコメント アウトしました。それらを削除すると、データベースへのすべてのリクエストが停止しました。ListView だけを追加し直したところ、クエリが再び 2 回実行されました。

EDS 自体に割り当てられる追加のイベント ハンドラはありません。

<asp:EntityDataSource ID="edsSerialNumbers" runat="server" ContextTypeName="DBName.Entities" EnableFlattening="False" 
                      EntitySetName="DIST_TABLE" Include="PRODUCT, DISTRIBUTION, DISTRIBUTION.COMPANY_SITE" 
                      EnableUpdate ="true" EnableViewState="true"
                      OrderBy="it.DISTRIBUTION.DIST_NAME, it.PRODUCT.SERIAL_NUMBER"></asp:EntityDataSource>

DataPager は、実際には ListView の外側に含まれる別の UserControl に埋め込まれており、2 回含まれています ...

<div class="dataTablePager">
    <kqp:TablePager ID="pgrTop" runat="server" PagedControlID="lvSerialNumbers"/>
</div>

 <asp:ListView ID="lvSerialNumbers" runat="server" DataKeyNames="ID" OnDataBound="lvSerialNumbers_DataBound" OnItemEditing ="lvSerialNumbers_ItemEditing" onitemdatabound="lvSerialNumbers_ItemDataBound" EnableViewState="true">
            ...

</asp:ListView>

<div class="dataTablePager">
    <kqp:TablePager ID="pgrBot" runat="server" PagedControlID="lvSerialNumbers"/>
</div>

EDS が触れられているコード ビハインドの唯一の場所は、PreRender フェーズです...

protected void Page_PreRender(object sender, EventArgs e)
{
    if (!kqpFilters.IsFiltered && !IsPostBack)
    {
        lvSerialNumbers.DataSourceID = null;            
    }
    else
    {
        lvSerialNumbers.DataSourceID = "edsSerialNumbers";
    }
}
4

1 に答える 1