ViewState не волшебная свалка для данных.Он предназначен для хранения информации о состоянии элементов управления и все.Существуют обстоятельства, когда люди используют его для других целей, но его никогда не следует использовать для хранения больших порций данных.
Что касается вашего вопроса, вам нужно внедрить какой-либо тип системы поиска или фильтрации, чтобы уменьшить ваши результаты.Не должно быть никакого сценария, когда вам нужно извлечь почти 1 000 000 результатов из базы данных.
Если вы не можете реализовать поиск, используйте разбиение на страницы и передайте границы строк хранимой процедуре, чтобы она возвращала только результатыдля текущей страницы.
Вот краткий пример того, как использовать подкачку, чтобы ограничить результаты одной страницей:
CREATE PROCEDURE dbo.GetProductsPaged (
@startRowIndex int,
@maximumRows int
) AS
SELECT PriceRank, ProductName, UnitPrice
FROM (SELECT ProductName, UnitPrice, ROW_NUMBER() OVER(ORDER BY UnitPrice DESC) AS PriceRank FROM Products ) AS ProductsWithRowNumber
WHERE RowRank > @startRowIndex AND RowRank <= (@startRowIndex + @maximumRows)
А вот статья, к которой вы можете обратиться за помощью в приведенном выше:http://www.asp.net/data-access/tutorials/efficiently-paging-through-large-amounts-of-data-vb
РЕДАКТИРОВАТЬ
Не похоже, что эта информация каким-либо образом зависит от пользователя, поэтому вы также можете посмотреть на кеширование данных, например:
DataTable table = new DataTable("LotsOfData");
if (Cache.Get("MyData") == null)
{
//retrieve the data from the database
table = GetLotsOfData();
//store the data in cache
Cache.Insert("MyData", table); //store the data in cache
}
else
{
//get the data from cache
table = (DataTable)Cache.Get("MenuData");
}