首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何缩短我的linq代码?

如何缩短我的linq代码?
EN

Stack Overflow用户
提问于 2010-08-11 16:30:53
回答 2查看 130关注 0票数 0

嗨;我试着运行我的代码。我的程序运行得更慢了。我需要给性能也写更少的代码在GetAliSpReqs(),GetMaintData();GetAccess....GET(...我怎样才能写出更有效的下面代码。它们太慢了,也没有用。例如,我尝试用GetAliSpReqs()编写少于1-2行的代码?我怎么能做到呢?请帮帮我。

代码语言:javascript
运行
复制
  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

        }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-11 16:33:26

让我们以这段代码为例:

代码语言:javascript
运行
复制
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);

你在一个循环中连接字符串。馊主意。相反,尝试这样做(假设.NET 4):

代码语言:javascript
运行
复制
var query = c.TaskRelations.Where(r => r.TaskId == taskID 
                                       && r.RelTypeId == 13))
                           .Select(r => r.RefAliSpReq.shortdesc);
return string.Join("; ", query);

在.NET 3.5中,你需要使用下面的代码:

代码语言:javascript
运行
复制
var query = c.TaskRelations.Where(r => r.TaskId == taskID 
                                       && r.RelTypeId == 13))
                           .Select(r => r.RefAliSpReq.shortdesc);
return string.Join("; ", query.ToArray());

诚然,我不能断定这是否是导致速度变慢的真正原因--但如果有很多字符串的话,很可能是这样的。

顺便说一句,这是一个糟糕的想法:

代码语言:javascript
运行
复制
catch
{
    return String.Empty;
}

相反,捕获特定的异常-或者在大多数情况下,只是让异常传播到调用者。至少你应该记录这个异常,这样你就能知道哪里出了问题。

票数 5
EN

Stack Overflow用户

发布于 2010-08-11 16:45:21

您的所有函数都使用不同的参数调用同一段代码:

代码语言:javascript
运行
复制
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;
}

所以让我们用它来做一个函数:

代码语言:javascript
运行
复制
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;
    }
}

现在,您可以从所有其他函数中调用此函数,如:

代码语言:javascript
运行
复制
public static string GetMaintData(int taskID)
{
    return GetData(taskID, 12);
}

所以这会使你的代码变得更短。为了提高性能,你应该使用Jons answer并在最后进行字符串的连接,而不是在每一步都使用+=,因为这是非常糟糕的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3456638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档