我有一些用于处理运行缓慢的 XML 文件的代码。有问题的代码如下。
第一个查询应该从一组大约 1,000 条记录中获取零条或一条记录。如果我得到一个,然后我使用来自第一个结果的 keyID 从另一组(保存大约 2,000 条记录)中提取所需的记录。然后,如果找到该记录,我将把三个值分配给我正在创建的新对象。
我在 VS2015 中检查性能(执行时间)时发现,所有这些语句总共花费了大约 330 毫秒。具体来说,每个值的分配(例如 MatProfileCall.MatSizeText = mss.First().MatSizeText;)每个花费大约 80 毫秒。然后我在两个查询中添加了一个 .ToArray() 到 vars 中。所有代码的执行时间都下降到不到 40 毫秒。
所以我的问题是,在这种情况下,基于另一个 Linq 查询的 Linq 查询中的值分配实际上每次都必须运行这两个查询吗?如果这是真的,那么无论何时您使用查询结果将值分配给另一个对象,总有一点将结果放入数组/列表时性能要好得多,因为 Linq 必须执行查询每一次?
var subMatSize = (from d in pInEdiMatTransS where d.EdiSystemMaterialString == retString && d.IsMapToMatSizeID == true && d.IsSubstituteMatType == false select d);
if (subMatSize.Any())
{
var mss = (from d in pmss where d.MatSizeID == subMatSize.First().DeafultMatSizeID select d);
if(mss.Any())
{
MatProfileCall.MatSizeText = mss.First().MatSizeText;
MatProfileCall.MatSizeID = mss.First().MatSizeID;
MatProfileCall.MatTypeID = mss.First().MatTypeID;
return Result.Ok<EDIMaterialProFile>(MatProfileCall);
}
else
{ return Result.Fail<EDIMaterialProFile>(THC_Constants.sMICEDICONVERTERROR + "IsMapToMatSizeID is True but MatSizeID not found in MaterialSize"); }
}
与 .ToArray() 相同的代码产生更快的代码:
var subMatSize = (from d in pInEdiMatTransS where d.EdiSystemMaterialString == retString && d.IsMapToMatSizeID == true && d.IsSubstituteMatType == false select d).ToArray();
if (subMatSize.Any())
{
var mss = (from d in pmss where d.MatSizeID == subMatSize.First().DeafultMatSizeID select d).ToArray();
if(mss.Any())
{
MatProfileCall.MatSizeText = mss.First().MatSizeText;
MatProfileCall.MatSizeID = mss.First().MatSizeID;
MatProfileCall.MatTypeID = mss.First().MatTypeID;
return Result.Ok<EDIMaterialProFile>(MatProfileCall);
}
else
{ return Result.Fail<EDIMaterialProFile>(THC_Constants.sMICEDICONVERTERROR + "IsMapToMatSizeID is True but MatSizeID not found in MaterialSize"); }
}