2010-08-11 6 views
0

hi; J'essaie de faire fonctionner mes codes. Mon programme tourne plus lentement. J'ai besoin de donner des performances écrire aussi moins de codes dans GetAliSpReqs(), GetMaintData(); GetAccess .... GET (... Comment puis-je écrire plus efficace ci-dessous les codes.Ils sont trop lent aussi pas utile.Exemple j'essaie pour écrire les de 1-2 ligne avec GetAliSpReqs() Comment puis-je s'il vous plaît me aider ... Comment puis-je raccourcir mes codes linq?

public void LoadById(string SearchItem) 
     { 
      var myTechnicTasks = engTaskCtx.Tasks.Where(task => task.MyTechnicReference.StartsWith(SearchItem)).Select(task => new MyTask() 
      { 
       id = task.id, 
       MyTechnicReference = task.MyTechnicReference, 
       MPDReference = task.MPDReference, 
       tasktypeid = task.tasktypeid, 
       shortdesc = task.shortdesc, 
       interval = task.interval, 
       critical = task.critical, 
       mandatory = task.mandatory, 
       dupinsp = task.dupinsp, 
       dualsystemmaint = task.dualsystemmaint, 
       MPDSkill = task.MPDSkill, 
       MPDCrew = task.MPDCrew, 
       MPDAccessMH = task.MPDAccessMH, 
       MPDTotalMH = task.MPDTotalMH, 
       extratime = task.extratime, 
       Team = task.Team, 
       MaintData = EngGetCalculatedTaskField.GetMaintData(task.id), 
       AliSpReqs = EngGetCalculatedTaskField.GetAliSpReqs(task.id), 
       Access = EngGetCalculatedTaskField.GetAccess(task.id), 
       preperation = task.preperation, 
       longdesc = task.longdesc, 
       applnotes = task.applnotes 
      }); 
      MyTechnicTaskList = myTechnicTasks.ToList(); 
     } 




    public static class EngGetCalculatedTaskField 
    { 
     private static TaskMaintenanceDataDataContext engTaskCtx { get; set; } 
     public static string GetMaintData(int taskID) 
     { 
      try 
      { 
       using (TaskCardContext.TaskMaintenanceDataDataContext dc = new TaskCardContext.TaskMaintenanceDataDataContext()) 
       { 
        string maintenanceData = String.Empty; 

        foreach (var item in dc.TaskRelations.Where(tableRaletions => tableRaletions.TaskId == taskID && tableRaletions.RelTypeId == 12)) 
        { 
         maintenanceData += item.RefMaintenance.shortdesc + "; "; 
        } 

        return maintenanceData.Substring(0, maintenanceData.Length - 2); 
       } 
      } 
      catch 
      { 
       return String.Empty; 
      } 

     } 
     public static string GetAliSpReqs(int taskID) 
     { 
      #region Old 
      try 
      { 
       using (TaskCardContext.TaskMaintenanceDataDataContext dc = new   TaskCardContext.TaskMaintenanceDataDataContext()) 
       { 
        string aliSpReqs = String.Empty; 

        foreach (var item in dc.TaskRelations.Where(tableRaletions => tableRaletions.TaskId == taskID && tableRaletions.RelTypeId == 13)) 
        { 
         aliSpReqs += item.RefAliSpReq.shortdesc + "; "; 
        } 
        return aliSpReqs.Substring(0, aliSpReqs.Length - 2); 


       } 
      } 
      catch 
      { 
       return String.Empty; 
      } 
      #endregion 


     } 
     public static string GetAccess(int taskID) 
     { 
      #region Old 
      try 
      { 
       using (TaskCardContext.TaskMaintenanceDataDataContext dc = new TaskCardContext.TaskMaintenanceDataDataContext()) 
       { 
        string access = String.Empty; 

        foreach (var item in dc.TaskRelations.Where(tableRaletions => tableRaletions.TaskId == taskID && tableRaletions.RelTypeId == 15)) 
        { 
         access += item.RefAccessPanel.shortdesc + "; "; 
        } 
        return access.Substring(0, access.Length - 2); 


       } 
      } 
      catch 
      { 
       return String.Empty; 
      } 
      #endregion 

     } 
} 

Répondre

5

Prenons ce petit morceau de code comme exemple:?

string aliSpReqs = String.Empty; 

foreach (var item in dc.TaskRelations.Where(tableRaletions => 
        tableRaletions.TaskId == taskID 
        && tableRaletions.RelTypeId == 13)) 
{ 
    aliSpReqs += item.RefAliSpReq.shortdesc + "; "; 
} 
return aliSpReqs.Substring(0, aliSpReqs.Length - 2); 

Vous » re concaténation des chaînes dans une boucle.C'est une mauvaise idée.À la place, essayez ceci (en supposant .NET 4):

var query = c.TaskRelations.Where(r => r.TaskId == taskID 
             && r.RelTypeId == 13)) 
          .Select(r => r.RefAliSpReq.shortdesc); 
return string.Join("; ", query); 

Dans .NET 3.5, vous aurez besoin d'utiliser cette place:

var query = c.TaskRelations.Where(r => r.TaskId == taskID 
             && r.RelTypeId == 13)) 
          .Select(r => r.RefAliSpReq.shortdesc); 
return string.Join("; ", query.ToArray()); 

Il est vrai que je ne peux pas dire si c'est en fait ce qui rend ce lent ou non - mais il pourrait bien être, s'il y a beaucoup de chaînes.

En aparté, ceci est une idée terrible:

catch 
{ 
    return String.Empty; 
} 

Catch spécifiques des exceptions au lieu - ou dans la plupart des cas, il suffit de laisser l'exception se propage à l'appelant. Au au moins vous devriez enregistrer l'exception afin que vous sachiez ce qui ne va pas.

1

Toutes vos fonctions appellent le même morceau de code avec un autre paramètre:

try 
{ 
    using (TaskCardContext.TaskMaintenanceDataDataContext dc = new TaskCardContext.TaskMaintenanceDataDataContext()) 
    { 
     string aliSpReqs = String.Empty; 

     foreach (var item in dc.TaskRelations.Where(tableRaletions => tableRaletions.TaskId == taskID && tableRaletions.RelTypeId == 13)) 
     { 
      aliSpReqs += item.RefAliSpReq.shortdesc + "; "; 
     } 
     return aliSpReqs.Substring(0, aliSpReqs.Length - 2); 
    } 
} 
catch 
{ 
    return String.Empty; 
} 

permet donc faire une fonction hors de lui:

private static string GetData(int taskID, int typeID) 
{ 
    try 
    { 
     using (TaskCardContext.TaskMaintenanceDataDataContext dc = new TaskCardContext.TaskMaintenanceDataDataContext()) 
     { 
      //This was taken from Jons answer!! 
      var query = c.TaskRelations.Where(r => r.TaskId == taskID 
               && r.RelTypeId == typeID)) 
             .Select(r => r.RefAliSpReq.shortdesc); 
      return string.Join("; ", query.ToArray()); 
     } 
    } 
    catch 
    { 
     return String.Empty; 
    } 
} 

Maintenant, vous pouvez appeler cette fonction de toutes vos autres fonctions comme:

public static string GetMaintData(int taskID) 
{ 
    return GetData(taskID, 12); 
} 

Cela rend votre code beaucoup plus court. Pour une amélioration des performances, vous devriez prendre Jons réponse et faire la concaténation de votre chaîne à la fin et pas à chaque étape en utilisant +=, parce que c'est très mauvais.

Questions connexes