2016-03-14 2 views
0

Итак, у меня есть функция, которая возвращает данные для использования в GridView. Требуется возраст для завершения (около 25 секунд). Я думаю, что я написал это очень плохо, и мне нужно оптимизировать его, чтобы он работал быстрее.Как я могу ускорить этот запрос Linq to SQL?

Это код:

 var pingresult = from p in db.GetTable<tblTBHealthPing>() 
         group p by p.ComputerAsset into g 
         select g.OrderByDescending(t => t.HealthPingTime).FirstOrDefault(); 

     var healthresult = from p in db.GetTable<tblTBHealthHeartbeat>() 
         group p by p.ComputerAsset into g 
         select g.OrderByDescending(t => t.HealthHeartbeatTime).FirstOrDefault(); 





     var query = (from t in TrackingBoardPCs() 
        where t.TrackingGroup == groupName 
        select new TrackingComputer 
        { 
         ComputerName = t.ComputerAsset, 
         IPAddress = t.ComputerIP, 
         Location = t.Location, 
         Pingable = (from p in pingresult where p.ComputerAsset == t.ComputerAsset select p.HealthPingResult).FirstOrDefault() ?? false, 
         PingTime = (from p in pingresult where p.ComputerAsset == t.ComputerAsset select p.HealthPingTime).FirstOrDefault() ?? DateTime.Now.AddDays(-100), 
         Username = (from p in healthresult where p.ComputerAsset == t.ComputerAsset select p.HealthCurrentUser).FirstOrDefault(), 
         CurrentWindow = (from p in healthresult where p.ComputerAsset == t.ComputerAsset select p.HealthCurrentWindow).FirstOrDefault(), 
         Uptime = (from p in healthresult where p.ComputerAsset == t.ComputerAsset select p.HealthUptime).FirstOrDefault() 
        }).OrderBy(t => t.Pingable); 
     return query; 

Там, наверное, лучший способ сделать это, а именно, сбросив первые два ВАР (pingresult и healthresult) и приведение их в на главном запросе каким-то образом, но у меня есть не знаю как. Любая помощь будет большой :)

+0

Пытались ли вы оставили присоединиться на '' pingresult' и healthresult': увидеть что-то вроде этого: http://stackoverflow.com/questions/2323619/linq -to-sql-left-join-to-max-aggregate? Кстати, что такое 'TrackingBoardPCs'? «IQueryable»? –

+0

Да, это IQueryable, то есть результат запроса LINQ to SQL –

ответ

0

Это определенно хорошая идея для встраивания подзапросов в основной запрос.

При этом вы заметите, что они всегда соединены с записью TrackingBoardPCs по ComputerAsset, поэтому им не нужно groupby это поле.

Вот IMO эквивалентный запрос:

var query = 
    from t in TrackingBoardPCs() 
    where t.TrackingGroup == groupName 
    join p in db.GetTable<tblTBHealthPing>() on t.ComputerAsset equals p.ComputerAsset 
    into pingInfo 
    join h in db.GetTable<tblTBHealthHeartbeat>() on t.ComputerAsset equals h.ComputerAsset 
    into heartbeatInfo 
    let p = pingInfo.OrderByDescending(p => p.HealthPingTime).FirstOrDefault() 
    let h = heartbeatInfo.OrderByDescending(p => p.HealthHeartbeatTime).FirstOrDefault() 
    let tc = new TrackingComputer 
    { 
     ComputerName = t.ComputerAsset, 
     IPAddress = t.ComputerIP, 
     Location = t.Location, 
     Pingable = p.HealthPingResult ?? false, 
     PingTime = p.HealthPingTime ?? DateTime.Now.AddDays(-100), 
     Username = h.HealthCurrentUser, 
     CurrentWindow = h.HealthCurrentWindow, 
     Uptime = h.HealthUptime 
    } 
    order by tc.Pingable 
    select tc; 
0

Я думаю, ваш pingresult и healthresult тип iqueryable. Так что ваш код собирается db эти полосы:

PingTime = (from p in pingresult where p.ComputerAsset == t.ComputerAsset select p.HealthPingTime).FirstOrDefault() ?? DateTime.Now.AddDays(-100), 
Username = (from p in healthresult where p.ComputerAsset == t.ComputerAsset select p.HealthCurrentUser).FirstOrDefault(), 
CurrentWindow = (from p in healthresult where p.ComputerAsset == t.ComputerAsset select p.HealthCurrentWindow).FirstOrDefault(), 
Uptime = (from p in healthresult where p.ComputerAsset == t.ComputerAsset select p.HealthUptime).FirstOrDefault() 

Если вы используете ToList() данные получать локальную память и должна быть быстрее. Возможно, вы можете использовать вот так:

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