我怎样才能缩短我的linq代码?

Pen*_*uen 0 .net c# linq linq-to-sql visual-studio

喜; 我试着运行我的代码.我的程序运行得更慢了.我需要给性能也GetAliSpReqs写更少的代码(),GetMaintData(); GetAccess的.... GET(...我怎样才能写出下面的代码更有效,他们的速度太慢也不是有用的forexample我试着写. GetAliSpReqs()小于1-2行?我怎么样?请帮帮我...

  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

        }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

我们以这段代码为例:

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);
Run Code Online (Sandbox Code Playgroud)

你在循环中连接字符串.这是个坏主意.相反,尝试这个(假设.NET 4):

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

在.NET 3.5中,您需要使用它:

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

不可否认,我不知道这究竟是什么让这个变慢还是没有 - 但如果有很多字符串的话,很可能就是这样.

顺便说一句,这是一个可怕的想法:

catch
{
    return String.Empty;
}
Run Code Online (Sandbox Code Playgroud)

相反,捕获特定的异常 - 或者在大多数情况下,只是让异常传播给调用者.在最起码让你知道发生了什么错误,你应该记录异常.