PerformDataBinding, извлечь количество строк из ObjectDataSource

У меня есть собственный GridView, который автоматически помещает количество строк из SqlDataSources в сетки для меня. Он вычисляет это количество в приведенном ниже коде. Обратите внимание, что этот вопрос относится к настраиваемому унаследованному элементу управления GridView, а не к материалам уровня страницы.

Как мне узнать в PerformDataBinding, что объект IEnumerable является ObjectDataSource? Я хочу конкретно узнать, что это за тип ObjectDataSource, а затем вызвать его функцию «получить общее количество строк».

Причина в том, что общее количество строк составляет (скажем) миллионы, тогда как на данный момент предложение ICollection возвращает количество только того, что было извлечено из базы данных, что обычно представляет собой «одну страницу» данных, так (скажем) 20 записей не 20 000 000!

У меня есть только пара конкретных типов ObjectDataSource, поэтому я мог бы выбирать их один за другим, если бы знал, как найти их имена в этом IEnumerable.

Я просмотрел этот ответ: Как получить количество строк в ObjectDataSource, но Я не знаю, как определить, с каким именно BLL я имею дело. Внутри этого объекта отладчика много чего, но я не вижу, что мне там нужно.

protected override void PerformDataBinding(IEnumerable data)
{
   // This does not work for my Object Data Sources, which return one page of 
   // records only, not the whole set. There must however be a way...
   if (data is IListSource)
   {
      IListSource list = (IListSource)data;
      rowcount = list.GetList().Count;
   }
   else if (data is ICollection)
   {
      ICollection collection = (ICollection)data;
      rowcount = collection.Count;    
   }
   base.PerformDataBinding(data);
}

person philw    schedule 13.10.2011    source источник
comment
В конце концов я нашел способ обойти это: переопределить CreateChildControls, в котором есть int, который является общим количеством строк в источнике данных. Это тот номер, который вам нужен, и он всегда под рукой.   -  person philw    schedule 28.01.2014


Ответы (1)


Просто перечислите без приведения.

protected override void PerformDataBinding(IEnumerable data)
        {
            var enum1 = data.GetEnumerator();
            int count = 0;
            while (enum1.MoveNext())
            {
                count++;
            }
            this.TotalRecordCount = count;

            base.PerformDataBinding(data);
        }
person lauh    schedule 16.02.2012
comment
Это может занять довольно много времени; кажется позором загружать все записи, а затем пересчитывать их одну за другой, когда основная цель того, что я делаю, - избегать загрузки этих записей, если вы понимаете, что я имею в виду. - person philw; 28.01.2014