[英]How can i shorter my linq codes?
你好 我尝试运行我的代码。 我的程序运行较慢。 我需要提高性能,还需要在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
}
}
让我们以这段代码为例:
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):
var query = c.TaskRelations.Where(r => r.TaskId == taskID
&& r.RelTypeId == 13))
.Select(r => r.RefAliSpReq.shortdesc);
return string.Join("; ", query);
在.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());
诚然,我不知道这是否是真正什么使这种缓慢或不- ,但它很可能是,如果有很多的字符串。
顺便说一句,这是一个可怕的想法:
catch
{
return String.Empty;
}
而是捕获特定的异常-或在大多数情况下,只需将异常传播到调用方即可。 至少您应该记录该异常,以便您知道出了什么问题。
您的所有函数都使用不同的参数调用同一段代码:
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;
}
因此,使它成为一个函数:
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;
}
}
现在,您可以从所有其他函数中调用此函数,例如:
public static string GetMaintData(int taskID)
{
return GetData(taskID, 12);
}
因此,这会使您的代码更短。 为了提高性能,您应该采取Jons答案并最后而不是通过使用+=
来进行字符串的串联,因为这很不好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.