我有一个将数据从 EntityDataSource 绑定到分页的 ASP.NET ListView 的页面。该查询实际上是一个相当复杂的查询,我不知道 EDS 确实是要走的路,但它是继承的代码,我希望无需完全重新设计页面即可解决此问题。
问题是当页面被回发时,带有过滤器参数,查询在没有过滤器的情况下执行一次,然后再次使用过滤器。问题是未过滤的结果集是 17+ 百万条记录并且请求超时。
所以我的问题是...
- 为什么查询执行两次?我认为它可能与 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";
}
}