Как обрабатываются IQueryables в ASP.NET MVC Views? - PullRequest
0 голосов
/ 07 июля 2011

У меня есть несколько таблиц в базе данных MySQL для представления записей с датчика.Одной из особенностей системы, которую я разрабатываю, является отображение этих записей из базы данных веб-пользователю, поэтому я использовал ADO.NET Entity Data Model для создания ORM, использовал Linq to SQL для получения данных из базы данных,и сохранил их в созданной мною ViewModel, поэтому я могу отобразить его с помощью помощника по сетке MVCContrib:

public IQueryable<TrendSignalRecord> GetTrends()
{
    var dataContext = new SmgerEntities();
    var trendSignalRecords = from e in dataContext.TrendSignalRecords
                select e;

    return trendSignalRecords;
}

public IQueryable<TrendRecordViewModel> GetTrendsProjected()
{
    var projectedTrendRecords = from t in GetTrends()
    select new TrendRecordViewModel
    {
        TrendID = t.ID,
    TrendName = t.TrendSignalSetting.Name,
    GeneratingUnitID = t.TrendSignalSetting.TrendSetting.GeneratingUnit_ID,
    //{...}
    Unit = t.TrendSignalSetting.Unit
    };
    return projectedTrendRecords;
}

Я вызываю GetTrendsProjectedMethod, а затем использую Linq для SQL, чтобы выбрать только те записи, которые мне нужны.В моем сценарии разработки он работает нормально, но когда я тестирую его в реальном сценарии, где количество записей намного больше (около миллиона записей), он перестает работать.

Я положил несколько сообщений отладки, чтобы проверить его, и все работает нормально, но когда он достигает оператора return View(), он просто останавливается, выдавая мне MySQLException: Timeout expired.Это заставило меня задуматься, получаются ли данные, которые я отправил на страницу, самой страницей (она выполняет поиск отображаемых элементов в базе данных только тогда, когда это нужно самой странице, или что-то в этом роде).

Всемои другие страницы используют тот же набор инструментов: MVCContrib Grid Helper, ADO.NET, Linq to SQL, MySQL и все остальное работает нормально.

Ответы [ 2 ]

1 голос
/ 07 июля 2011

Что ж, если информация в этом блоге верна, метод .AsPagination требует сортировки данных по определенному столбцу.Возможно, что попытка сделать OrderBy для таблицы с миллионами записей в ней - это просто трудоемкая операция и время ожидания.

1 голос
/ 07 июля 2011

Вы обязательно должны разбить свой набор данных на страницы перед выполнением запроса, если у вас есть миллионы записей.Это можно сделать, используя методы расширения .Skip и .Take.И их следует вызывать перед выполнением любого запроса к вашей базе данных.

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

...