简体   繁体   English

如何缩短我的linq代码?

[英]How can i shorter my linq codes?

hi; 你好 i try to run my codes. 我尝试运行我的代码。 My program more slowly runnig. 我的程序运行较慢。 i need to give performance also write less codes in GetAliSpReqs(), GetMaintData();GetAccess....GET(... How can i write more effective below codes. They are too slow also not useful. forexample i try to write les than 1-2 line with GetAliSpReqs()? How can i ? please help me... 我需要提高性能,还需要在GetAliSpReqs(),GetMaintData(); GetAccess .... GET(...中编写更少的代码。如何在代码下面编写更有效的代码?它们太慢了,也没有用。例如,我尝试编写如果使用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

        }
}

Let's take this bit of code as an example: 让我们以这段代码为例:

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);

You're concatenating strings in a loop. 您正在将字符串串联在一起。 That's a bad idea. 那是个坏主意。 Instead, try this (assuming .NET 4): 相反,请尝试以下操作(假设.NET 4):

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

In .NET 3.5 you'd need to use this instead: 在.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());

Admittedly I can't tell whether that's actually what's making this slow or not - but it could well be, if there are a lot of strings. 诚然,我不知道这是否是真正什么使这种缓慢或不- ,但它很可能是,如果有很多的字符串。

As an aside, this is a terrible idea: 顺便说一句,这是一个可怕的想法:

catch
{
    return String.Empty;
}

Catch specific exceptions instead - or in most cases, just let the exception propagate to the caller. 而是捕获特定的异常-或在大多数情况下,只需将异常传播到调用方即可。 At the very least you should log the exception so you know what's going wrong. 至少您应该记录该异常,以便您知道出了什么问题。

All of your functions are calling the same piece of code with a different parameter: 您的所有函数都使用不同的参数调用同一段代码:

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;
}

So lets make a function out of it: 因此,使它成为一个函数:

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;
    }
}

Now you can call this function from all your other functions like: 现在,您可以从所有其他函数中调用此函数,例如:

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

So this makes your code much shorter. 因此,这会使您的代码更短。 For a performance boost you should take Jons answer and do the concatenation of your string at last and not at every step by using += , cause this is very bad. 为了提高性能,您应该采取Jons答案并最后而不是通过使用+=来进行字符串的串联,因为这很不好。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM