2012-03-20 51 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