linqの結果をforeachで取得しているのですが、処理速度を上げるにはどうすればいいですか
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
};
`
一応、考えて書いてみましたが、考え方としてはあってますでしょうか?
コメントいただけると幸いです。