EntityDataSource执行两次查询

时间:2013-04-15 15:34:47

标签: asp.net entitydatasource

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

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

所以我的问题是......

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

  2. 更新: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实际上嵌入在ListView之外的单独UserControl中,并包含两次......

    <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";
        }
    }
    

1 个答案:

答案 0 :(得分:0)

除了将ListView的数据源分配给EDS的地方评论一切外,我无法解决此问题。

我将通过撕掉EDS并将其替换为存储过程调用来解决它。非常令人沮丧的是,虽然这个问题存在于大约10-15个屏幕上而且没有替代方案,我将不得不从头开始重新编写每个屏幕。