0

我有一个将数据从 EntityDataSource 绑定到分页的 ASP.NET ListView 的页面。该查询实际上是一个相当复杂的查询,我不知道 EDS 确实是要走的路,但它是继承的代码,我希望无需完全重新设计页面即可解决此问题。

问题是当页面被回发时,带有过滤器参数,查询在没有过滤器的情况下执行一次,然后再次使用过滤器。问题是未过滤的结果集是 17+ 百万条记录并且请求超时。

所以我的问题是...

  1. 为什么查询执行两次?我认为它可能与 ListView 上的 DataPager 有关,但是当我从页面中删除它时,它并没有改变任何东西。

更新:2013/04/16

谢谢@bUKaneer 和@lthibodeaux。我认为将请求信息添加到 OP 会很有帮助。

按照建议,我注释掉了 Pager 控件和列表视图。删除后,对数据库的所有请求都停止了。我只添加了 ListView 并且查询再次执行了两次。

没有为 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 实际上嵌入在一个单独的 UserControl 中,该 UserControl 包含在 ListView 之外,并且包含两次......

<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

0

在将 ListView 的数据源分配给 EDS 的位置之外的所有内容都注释掉之后,我无法解决这个问题。

我将通过删除 EDS 并将其替换为对存储过程的调用来解决它。非常令人沮丧,因为这个问题存在于大约 10-15 个屏幕上,并且没有其他选择,我将不得不从头开始重新编写每个屏幕。

于 2013-04-22T13:41:36.023 回答