C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: DataTable から DataTable を作れますか?


(過去ログ 129 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■76541 / inTopicNo.1)  DataTable から DataTable を作れますか?
  
□投稿者/ よぽん (51回)-(2015/07/21(Tue) 18:13:26)

分類:[.NET 全般] 

DataTable DT から Select を使ったりして
SQL のようにデータをとってくる方法ありませんか?

たとえば DataTable に以下のようなデータが入っている場合

BA NM SA
A, 1, ab
B, 2, bc
C, 3, cd
A, 4, ab
D, 5, ef


SQLでは次のようにできるんですけど

SELECT DISTINCT BA
FROM DT

簡単にできないので
力づくでやっちゃうと

List<string> BAList = new List<string>();
for(int inum = 0; inum < DT.Rows.Count; inum++)
{
 if(BAList.IndexOf(DT.Rows[inum]["BA"].ToString()) >= 0) continue;
 BAList.Add(DT.Rows[inum]["BA"].ToString());
}

DataTable NewDT = new DataTable();
NewDT.Columns.Add("BA");

for(int inum = 0; inum < BAList.Count; inum++)
{
 dr = NewDT.NewRow();
 dr["BA"] = BAList[inum];
 NewDT.Rows.Add(dr);
}

A,
B,
C,
D,

を取得する。

Select() とか、 Distinct()
を使ってできませんか?
引用返信 編集キー/
■76545 / inTopicNo.2)  Re[1]: DataTable から DataTable を作れますか?
□投稿者/ Amateur (6回)-(2015/07/21(Tue) 19:17:33)
No76541 (よぽん さん) に返信

結果としてDataTableという形は必須条件なのでしょうか?
引用返信 編集キー/
■76549 / inTopicNo.3)  Re[2]: DataTable から DataTable を作れますか?
□投稿者/ よぽん (52回)-(2015/07/22(Wed) 08:07:39)
No76545 (Amateur さん) に返信

データソースから読み込んだデータをもとにしているので、
DataTableがもとになっています。

実際にはDataTableではなくて、
[データベース名:Main]DataSet.[テーブル名:Item]DataTable です。

SQLで処理すると数千回処理を行うことになり、処理時間が
かかったので、すべてのデータを読込んで、ローカルで
処理したほうが早いような気がしたので。
引用返信 編集キー/
■76560 / inTopicNo.4)  Re[3]: DataTable から DataTable を作れますか?
□投稿者/ Amateur (7回)-(2015/07/22(Wed) 11:43:54)
No76549 (よぽん さん) に返信


元がDataTableなのはよいとして
お聞きしたのは

>DataTable を作れますか?

作るのがDataTableでないとだめなのか?

です。
引用返信 編集キー/
■76576 / inTopicNo.5)  Re[4]: DataTable から DataTable を作れますか?
□投稿者/ しゃむこ (10回)-(2015/07/23(Thu) 14:18:38)
「SQLの様に」ではないですが、
DataViewを利用すれば、もう少し楽にはなるのではないでしょうか。

DataTable NewDT = DT.DafaultView.ToTable(true, "BA");
引用返信 編集キー/
■76596 / inTopicNo.6)  Re[1]: DataTable から DataTable を作れますか?
□投稿者/ ぶなっぷ (37回)-(2015/07/27(Mon) 11:13:42)
遅いということなら、考えられる手段は以下の通り。

基本、データベースのサーバーサイドの処理は速いです。
自分でコードを書くよりずっと速いです。

遅いのは通常、SQLの文解析時間と、結果表を返す際の伝送速度です。

つまり、
> SQLで処理すると数千回処理を行うことになり、処理時間が
数千回もSQLを投げるから遅いということと、この処理ならBA以外のフィールドは
いらないので、SQL文は、
SELECT BA FROM DT;
で十分です。
結果表を小さくすれば伝送速度が上がります。

ただし、これで話しが終わるなら、SQLを数千回も投げる必要はないでしょうから、
たぶん、SQLにはWHERE文が含まれていますよね?
WHERE文を変えながら、数千回投げていると思われますがいかがですか?

そうだと仮定した場合、いったん、数千回のSQLにおいて、WHERE文で対象となる
レコードをまとめてとってくるSQLに変えます。
(例) 現状の数千回のSQLが以下のようだとして、
SELECT BA WHERE A=A1 AND B=B1
SELECT BA WHERE A=A1 AND B=B2
SELECT BA WHERE A=A1 AND B=B3

このWHERE条件を全てORして、以下のように変えます。
SELECT BA, B WHERE A=A1
(コードでBをフィルタするのでSELECT対象にBを含める)
その上で、Bフィールドによるフィルタだけをコードレベルに置き換えます。

このSQLの結果がDTに入っていると仮定しましょう。
public class DTData
{
public string BA;
public string B;
};

var DTDataList = new List<DTData>();
foreach(DataRow Row in DT.Rows)
{
DTDataList.Add(new DTData()
{
BA = Row["BA"],
B = Row["B"];
});
}
として、DTの内容を全て、DTDataListに移します。

後は、以下のように呼ぶだけです。
var ResultList = (from n in DTDataList where n.B == "B1" select n.BA).Distinct();

これで、ResultList に
A,
B,
C,
D,
が入ってきます。

「where n.B == "B1」"の"B1"を変えながら、数千回ループ処理ですね。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -