3

IEqualityComparerLINQ to Entities を使用して、データベース内の「ほぼ重複」を照合するために使用しています。

約 40,000 のレコード セットがあるため、このクエリが完了するまでに約 15 秒かかります。以下のコードに構造的な変更を加えることができないかと考えました。

私のパブリックメソッド

public List<LeadGridViewModel> AllHighlightingDuplicates(int company)
        {

            var results = AllLeads(company)
                  .GroupBy(c => c, new CompanyNameIgnoringSpaces())
                  .Select(g => new LeadGridViewModel
                  {
                      LeadId = g.First().LeadId,
                      Qty = g.Count(),
                      CompanyName = g.Key.CompanyName
                  }).OrderByDescending(x => x.Qty).ToList();

            return results;

        }

リードをつかむプライベートメソッド

private char[] delimiters = new[] { ' ', '-', '*', '&', '!' };
private IEnumerable<LeadGridViewModel> AllLeads(int company)
        {
            var items = (from t1 in db.Leads
                          where
                              t1.Company_ID == company
                          select new LeadGridViewModel
                          {
                              LeadId = t1.Lead_ID,
                              CompanyName = t1.Company_Name,
                          }).ToList();


            foreach (var x in items)
                x.CompanyNameStripped = string.Join("", (x.CompanyName ?? String.Empty).Split(delimiters));

            return items;
        }

私のIEqualityComparer

 public class CompanyNameIgnoringSpaces : IEqualityComparer<LeadGridViewModel>
    {
        public bool Equals(LeadGridViewModel x, LeadGridViewModel y)
        {
            var delimiters = new[] {' ', '-', '*', '&', '!'};
            return delimiters.Aggregate(x.CompanyName ?? String.Empty, (c1, c2) => c1.Replace(c2, '\0')) 
                == delimiters.Aggregate(y.CompanyName ?? String.Empty, (c1, c2) => c1.Replace(c2, '\0'));
        }

        public int GetHashCode(LeadGridViewModel obj)
        {
            var delimiters = new[] {' ', '-', '*', '&', '!'};
            return delimiters.Aggregate(obj.CompanyName ?? String.Empty, (c1, c2) => c1.Replace(c2, '\0')).GetHashCode();
        }
    }
4

2 に答える 2

2

以下を使用して、すべての置換を一度に実行できますRegex.Replace

public class CompanyNameIgnoringSpaces : IEqualityComparer<LeadGridViewModel>
{
    static Regex replacer = new Regex("[ -*&!]");
    public bool Equals(LeadGridViewModel x, LeadGridViewModel y)
    {
        return replacer.Replace(x.CompanyName, "")
            == replacer.Replace(y.CompanyName, "");
    }

    public int GetHashCode(LeadGridViewModel obj)
    {
        return replacer.Replace(obj.CompanyName, "").GetHashCode();
    }
}

それはもっと速いかもしれません。試してみる!(また、nullチェックをスキップしたことに注意してください。おそらく、何らかの方法でそれらを元に戻したいと思うでしょう。)

于 2012-11-06T14:59:15.527 に答える
2

1 つの方法は、会社名から不要な文字を削除した計算列を DB に作成することです。

次に、この列を使用してフィルタリングを行います。

これにより、おそらく挿入時のパフォーマンスがわずかに低下しますが、クエリ時間は大幅に改善されるはずです。

于 2012-11-06T15:04:52.800 に答える