2013-02-22 197 views
0

我在我的mvc項目中使用telerik mvc網格,我的表格有大約1百萬條記錄。我的網格需要花費太多時間來加載。Mvc Telerik grid With large database

這是我的查詢 //

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

你有一個瘋狂的連接和嵌套搜索。我注意到的一件事是你將狀態存儲爲一個字符串數據類型,它比使用int要求要求更高。如果你刪除where子句'where a.Status ==「A」',而取10000行'取10000'它執行得更快嗎?只是一個可能會導致您找到解決方案的建議。 – OakNinja 2013-02-22 10:25:23

+0

其實我的查詢是不需要太多時間..我返回查詢需要很多時間來返回bcoj我使用Tolist ..如果我刪除tolist然後我有其他錯誤「像超時服務器錯誤」 – 2013-02-22 11:03:36

回答

0

ToList()實際調用查詢,因此,如果調用ToList()的時間太長,這意味着該問題是與查詢。

在LINQ中,您可以使用類似the following post的分頁方式;這個想法是使用跳過和採取跳過X的記錄,只有走ÿ記錄,如:

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

用1M記錄,我會強烈建議用一個存儲過程,這將大大替換它,多對於你想要做的事情更快。考慮自定義分頁方法,它具有大型結果集的作品對我非常好:

如果不能使用存儲過程,閱讀這將有助於理解分頁需要完成什麼。使用LINQ,您需要檢查正在生成的SQL,以查看您還可以使用SQL事件探查器或LINQPad來優化查詢的位置。

+0

acc。我們不能在我們的項目中使用sp – 2013-02-25 13:40:49

+0

哇,這並不好。但是,您可以像在LINQ中一樣實現相同的功能:http://blog.kurtschindler.net/post/paging-through-lists-with-linq。如果您只在當時取得您需要的記錄,您將獲得更好的表現。我編輯了我上面的回覆。 – 2013-02-25 14:01:25