LINQ方法比较2个列表

时间:2014-05-06 00:29:08

标签: linq linq-to-entities

只有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);
                }
            }

就像我说的,这只是一个例子。其中一些列表包含数百个条目。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

你没有说出contactRecordsprofile到底是什么,所以很难确定如何以最佳方式解决问题,但是应该遵循特技:

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