2012-03-20 50 views
1

我有一個(相當長)查詢需要大約1:30分鐘執行的性能問題。我能夠找到需要執行的部分,但現在我需要關於如何優化查詢的建議。LINQ到實體查詢優化

var ticketList = (from t in db.Ticket 
          select t).ToList(); 

     int idFirma = Convert.ToInt32(kontakt.idFirma); 

     gvTicketi.DataSource = from t in ticketList 
           orderby t.idTicket, t.RedniBroj, t.DatumPrijave 
           select new 
           { 
            t.idTicket, 
            t.idFirma, 
            t.idKontakt, 
            t.idManager, 
            t.idNadredeniTicket, 
            TicketNumber = t.idNadredeniTicket + "-" + t.RedniBroj, 
            t.Biljeske, 
            t.DatumDo, 
            t.DatumPrijave, 
            t.OpciPrioritet, 
            t.Opis, 
            t.OpisZatvoren, 
            t.Prioritet, 
            t.Status, 
            t.Tip, 
            t.VrstaPrijave, 
            t.Zatvoren, 
            t.DatumZatvaranja, 
            t.IzdanRacun, 
            NazivKontakta = t.Kontakt == null ? "Bez kontakta" : t.Kontakt.Ime + " " + t.Kontakt.Prezime, 
            Manager = t.idManager == null ? "Svi manageri" : (from k in db.Kontakt 
                        where k.idKontakt == t.idManager 
                        select k.Ime + " " + k.Prezime).SingleOrDefault(), 
            NazivTvrtke = t.Firma.Naziv, 
            DailyCount = db.Daily.Count(dt => dt.idTicket == t.idTicket && dt.Dolazak == true), 
            DailySum = db.Daily.Count(dt => dt.idTicket == t.idTicket) == 0 ? 0 : db.Daily.Where(dt => dt.idTicket == t.idTicket).Sum(dts => dts.EfektivnoSati) 
           }; 

性能問題#1

Manager = t.idManager == null ? "Svi manageri" : (from k in db.Kontakt where k.idKontakt == t.idManager select k.Ime + " " + k.Prezime).SingleOrDefault(), 

性能問題#2

DailyCount = db.Daily.Count(dt => dt.idTicket == t.idTicket && dt.Dolazak == true), 
DailySum = db.Daily.Count(dt => dt.idTicket == t.idTicket) == 0 ? 0 : db.Daily.Where(dt => dt.idTicket == t.idTicket).Sum(dts => dts.EfektivnoSati) 

通過去除這兩部分我能夠查詢加速爲8秒。

任何建議,將不勝感激。謝謝!

+1

您可以通過在數據庫表中添加相關的索引加快查詢索引(這一點,如果你使用SQL Server)。 – Mathieu 2012-03-20 11:34:08

回答

0

您可以在一個單一的形式

DailySum = db.Daily.Where(dt => dt.idTicket == t.idTicket) 
        .Sum(dts => (int?)dts.EfektivnoSati) 

對於剩下的改善查詢:

  1. Daily表:上idTicket列中添加索引

  2. Kontakt表:添加idKontakt列上的索引(如果還不是 一個PK)

或者更好的得到生成的SQL,看看如何SSMS會幫助你

+0

謝謝你的回答!我會試一試! – 2012-03-20 11:34:42