2つのdataTableからlinqを使ってデータを抽出しています。
1つは1万件強、もう1つは4万件ほどデータが入っています。
1万件程度であれば3,4分で終わるのですが、4万件になったとたんに1時間以上、処理がかかります。

同じ処理を通っているのにこの差は何でしょうか?
LINQ 複数テーブルjoinと複合条件とwhere
こちらで質問した処理を書いています。

  

List<DataClass> dataList = new List<DataClass>(); 
  DataClass kdcc = new DataClass(); 
    foreach (var item in em) {
          kdcc.ID = item.ID; 
          kdcc.DATE = item.DATE; 
          kdcc.NO = item.NO;
          kdcc.DSP_NO = item.DSP_NO;
          kdcc.BI = item.BI; 
          kdcc.NAME_ID = item.NAME_ID.ToString(); 
          dataList.Add(kdcc);
           } 

これでlinqの結果は取得できるのですが、foreachの部分はもう少し早く処理できないものでしょうか?

追記

@pgrho さん
前回教えていただいたlinq

`

from em in Table3
join c1 in table4 on em.TOUROKU_1 equals c1.TOUROKU_NO
join c2 in table4 on em.TOUROKU_2 equals c2.TOUROKU_NO
select new
{
   em.ID,
   em.DATE,
   em.NO,
   em.DSP_NO,
   BI = Table1.Where(v => em.UR == v.NoFlg && v.RTth != "0").Select(v => "R" + v.RTth).FirstOrDefault()
       + Table1.Where(v => em.UL == v.NoFlg && v.LTth != "0").Select(v => "R" + v.LTth).FirstOrDefault()
       + Table1.Where(v => em.DR == v.NoFlg && v.RTth != "0").Select(v => "r" + v.RTth).FirstOrDefault()
       + Table1.Where(v => em.DL == v.NoFlg && v.LTth != "0").Select(v => "l" + v.LTth).FirstOrDefault(),
   NAME_ID = Table2.Where(v => em.ID == v.ID
                            && c1.NAME_1 == v.TOUROKU_NO
                            && v.TOUROKU_NO != "0"
                            && em.DATE >= v.START_DATE
                            && em.DATE < v.END_DATE)
                    .Select(v => v.BCD)
                    .FirstOrDefault() // b1
            + Table2.Where(v => em.ID == v.ID
                            && c1.NAME_2 == v.TOUROKU_NO
                            && v.TOUROKU_NO != "0"
                            && em.DATE >= v.START_DATE
                            && em.DATE < v.END_DATE)
                    .Select(v => v.BCD) // b2
                    .FirstOrDefault() 
                    //TODO  +where文を追加
                `

上のlinqをこのように分けてみたのですが..最初のqueryで時間がかかっています。

`

 BCD = Table2.Where(v => em.ID == v.ID
                     && v.TOUROKU_NO != 0
                     && em.DATE >= v.START_DATE
                     && em.DATE < v.END_DATE)
                    .Select(v => v.BCD)
                    .FirstOrDefault()

`
の部分がネックなような気がします。

以下、私が考えた分けたlinqです。

`

 var query = from em in Table3
                select new {
                     ID = em.ID,
                     TOUROKU_NO = Table2.Where(a => em.ID == a.ID)
                     .Select(a =>a.TOUROKU_NO)
                     .FirstOrDefault(),
                     BCD = Table2.Where(v => em.ID == v.ID
                         && v.TOUROKU_NO != 0
                         && em.DATE >= v.START_DATE
                         && em.DATE < v.END_DATE)
                        .Select(v => v.BCD)
                        .FirstOrDefault()
                }


     var query2 = from em in Table3
                        join c1 in table4  on em.TOUROKU_1 equals c1.TOUROKU_NO
                        join c2 in table5 on em.TOUROKU_2 equals c2.TOUROKU_NO
                        join c4 in query on em.ID equals c4.ID
                   select new {
                     ID = em.ID,
                     DATE = em.DATE,
                     NO = em.NO,
                     NAME_ID = query.Where(v => em.ID == v.ID
                         && c1.NAME_1 == v.TOUROKU_NO)
                        .Select(v => v.BCD)
                        .FirstOrDefault() // c1

                    + query.where(v => em.ID == v.ID
                                      && c1.NAME_2 == v.TOUROKU_NO)
                                      .Select(v => v.BCD)
                                      .FirstOrDefault()
                    //TODO NAME_16まで同じ処理
                         };

//ここはほとんど変わらず

       var query3 = from em in Table3
                select new {
                  em.ID,
                  em.DATE,
                  em.NO,
                  em.DSP_NO,
                  em.KUBUN,
                  BUI = Table1.Where(v => em.UR == v.NoFlg && v.RTth != "0").Select(v => "R" + v.RTth).FirstOrDefault()
           + Table1.Where(v => em.UL == v.NoFlg && v.LTth != "0").Select(v => "R" + v.LTth).FirstOrDefault()
           + Table1.Where(v => em.DR == v.NoFlg && v.RTth != "0").Select(v => "r" + v.RTth).FirstOrDefault()
           + Table1.Where(v => em.DL == v.NoFlg && v.LTth != "0").Select(v => "l" + v.LTth).FirstOrDefault()
                };


                      var resultJoin = from q3 in query3
                     join q2 in query2 on  q3.KANJA_ID equals byoumei.KANJA_ID
                     select new {
                       ID = q3.KANJA_ID,
                       DATE = q3.RAIIN_DATE,
                       NO = q3.RAIIN_NO,
                       DSP_NO = q3.BUI_DSP_NO,
                       BI = q3.BUI,
                       NAME_ID = query2.Where(v => q3.DATE == v.DATE && q3.NO == v.NO).Select(v => v.NAME_ID).FirstOrDefault(),
                       KUBUN = q3.KUBUN
                     };
             `

一応、考えて書いてみましたが、考え方としてはあってますでしょうか?

コメントいただけると幸いです。