EntityDataSource Выполняет запрос дважды

У меня есть страница, которая связывает данные из EntityDataSource с постраничным ASP.NET ListView. Запрос на самом деле является довольно сложным запросом, и я не знаю, является ли EDS действительно подходящим вариантом, но это унаследованный код, и я надеюсь решить эту проблему без необходимости полной реорганизации страницы.

Проблема в том, что когда страница отправляется назад с параметром фильтра, запрос выполняется один раз без фильтра, а затем еще раз с фильтром. Проблема в том, что нефильтрованный набор результатов содержит более 17 миллионов записей и время выполнения запроса.

Итак, мой вопрос...

  1. Почему запрос выполняется дважды? Я подумал, что это может быть связано с DataPager в ListView, но когда я удалил его со страницы, это ничего не изменило.

Обновление: 2013/04/16

Спасибо @bUKaneer и @lthibodeaux. Я подумал, что было бы полезно добавить информацию о запросе в ОП.

Как и предполагалось, я закомментировал элементы управления пейджером и представление списка. После их удаления все запросы к базе данных прекратились. Я добавил обратно только 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, который включен вне 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";
    }
}

1 ответ

Решение

После комментирования ВСЕГО, кроме места, где источник данных ListView назначен для EDS, я не смог решить эту проблему.

Я буду обходить его, вырывая EDS и заменяя его вызовом хранимой процедуры. Очень неприятно, поскольку эта проблема существует на 10-15 экранах, и без альтернативы мне придется переписывать каждый с нуля.

Другие вопросы по тегам