2013-02-22 4 views
0

Я использую сетку mvc telerik в моем проекте mvc, у моего стола около 1 миллиона записей. Моя сетка занимает слишком много времени для загрузки.Mvc Telerik grid С большой базой данных

Это мой запрос //

var bib = (from a in db.Bibs 
        join inf in db.InfoTypes 
        on a.InfoTypeId equals inf.Id 
        where a.Status == "A" 

        select new BibViewModel 
        { 
         Id = a.Id, 
         Type = inf.Type, 
         InfoType = inf.Description, 
         Title = (from asd in db.BibContents where asd.BibId == a.Id && asd.TagNo == "245" && asd.Sfld == "a" select asd.Value).FirstOrDefault(), 
         Author = (from asd in db.BibContents where asd.BibId == a.Id && asd.TagNo == "100" && asd.Sfld == "a" select asd.Value).FirstOrDefault(), 
         CatalogueDate = a.CatalogDate, 
         Contents = "", 
         CreatedOn = a.CreatedOn, 
         ItemRelation = db.Items.Any(item => item.BibId == a.Id), 
         IssueRelation = db.Issues.Any(item => item.BibId == a.Id), 

        }); 


     return View(new GridModel(bib.OrderByDescending(x => x.CreatedOn).Tolist())); 
+0

У вас сумасшедшая серия объединений и вложенных поисков. Одна вещь, которую я замечаю, заключается в том, что вы сохраняете Status как строковый тип данных, который гораздо более требовательный, чем использование int вместо этого. Если вы удалите предложение where, где a.Status == «A» и вместо этого берете 10000 строк с «take 10000», выполняется ли оно быстрее? Просто предложение, которое может привести вас к решению. – OakNinja

+0

На самом деле мой запрос не занимает много времени. Мой запрос возврата занимает много времени, чтобы вернуть bcoj. Я использую Tolist. Если я удаляю список, то у меня есть другая ошибка «как Time Out Server Error» –

ответ

0

ToList() на самом деле вызывает запрос, поэтому, если вы звоните ToList() занимает слишком много времени, это означает, что проблема с запросом.

В LINQ вы можете использовать подкачку, как в the following post; идея заключается в том, чтобы использовать Пропустить и принять, чтобы пропустить X записей, и принимать только Y записи, как:

var results = (from .. select ..).Skip(X).Take(Y) 

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

Если вы не можете использовать хранимые процедуры , чтение этого поможет понять, что нужно сделать с разбивкой на страницы. С LINQ вы захотите изучить генерируемый SQL, чтобы узнать, где вы также можете настроить запрос, используя SQL-профилировщик или LINQPad.

+0

acc. клиенту мы не можем использовать sp в нашем проекте –

+0

Вау, это нехорошо. Однако вы можете реализовать такую ​​же функцию в LINQ, как и в случае: http://blog.kurtschindler.net/post/paging-through-lists-with-linq. Вы получите гораздо лучшую производительность, если в то время вы будете брать только записи. Я отредактировал свой ответ выше. –

Смежные вопросы