只有GOT成为更好的方法才能做到这一点。我正在研究2000行代码,这些代码在性能方面造成了巨大的问题,当然,"脚本没有响应"消息。
它使用linq到sql,linq到实体和其他一切。
到目前为止,我看到的最大问题是有数十个和几十个foreach语句。这些中的每一个都循环(有时不止一次)一组对象。
我并不是linq实体方法中的佼佼者,但我知道我已经看过.Contains和.Select的例子我认为这将是一个不错的选择。
我知道必须有一个LINQ方法才能更有效地完成这项工作。
以下是正在发生的事情的示例:
//RETURNS LIST<LandingPageVendorEvaluation>
var evaluatedVendors = contactRecords.Where(x => x.VendorId > 0)
.Select(x => new LandingPageVendorEvaluation()
{
ClientVendorId = x.ClientVendorId,
VendorId = x.VendorId,
VendorName = x.VendorName,
Outcome =
selectedCount > 0
? (x.VendorIsSelected ? OpportunityOutcomes.Win :
OpportunityOutcomes.Loss): OpportunityOutcomes.NoDecision,
Selected = x.VendorIsSelected,
IsClient = x.VendorIsClient,
IsOther = x.VendorIsOther
}).OrderBy(x => x.VendorName).Distinct().ToList();
// NOW a foreach to see if this list of
// LandingPageVendorEvaluation objects is in another
// List<LandingPageVendorEvaluation >. If it isn't there,
// it's added
foreach (var ev in evaluatedVendors)
{
if (profile.EvaluatedVendors.Where(v => v.VendorId ==
ev.VendorId).Count() == 0)
{
profile.EvaluatedVendors.Add(ev);
}
}
就像我说的,这只是一个例子。其中一些列表包含数百个条目。
有什么建议吗?
答案 0 :(得分:0)
你没有说出contactRecords
和profile
到底是什么,所以很难确定如何以最佳方式解决问题,但是应该遵循特技:
var evaluatedVendors = contactRecords.Where(x => x.VendorId > 0)
.Select(x => new LandingPageVendorEvaluation()
{
ClientVendorId = x.ClientVendorId,
VendorId = x.VendorId,
VendorName = x.VendorName,
Outcome =
selectedCount > 0
? (x.VendorIsSelected ? OpportunityOutcomes.Win :
OpportunityOutcomes.Loss): OpportunityOutcomes.NoDecision,
Selected = x.VendorIsSelected,
IsClient = x.VendorIsClient,
IsOther = x.VendorIsOther
}).OrderBy(x => x.VendorName).Distinct();
var vendorIds = profile.EvaluatedVendors.Select(v => v.VendorId);
var itemsToAdd = evaluatedVendors.Where(v => !vendorIds.Contains(v.VendorId)).ToList();
profile.EvaluatedVendors.AddRange(itemsToAdd);
但是,由于您没有指定profile
是什么,因此可能没有AddRange
方法。如果是这种情况,您可以代替itemsToAdd
进行迭代,然后再拨打Add
。