EntityDataSource Выполняет запрос дважды
У меня есть страница, которая связывает данные из EntityDataSource с постраничным ASP.NET ListView. Запрос на самом деле является довольно сложным запросом, и я не знаю, является ли EDS действительно подходящим вариантом, но это унаследованный код, и я надеюсь решить эту проблему без необходимости полной реорганизации страницы.
Проблема в том, что когда страница отправляется назад с параметром фильтра, запрос выполняется один раз без фильтра, а затем еще раз с фильтром. Проблема в том, что нефильтрованный набор результатов содержит более 17 миллионов записей и время выполнения запроса.
Итак, мой вопрос...
- Почему запрос выполняется дважды? Я подумал, что это может быть связано с 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 экранах, и без альтернативы мне придется переписывать каждый с нуля.