はじめに
C#のDataTableクラスでLINQを使ったコードを書く際に、暫くコードを書かないと、LINQは複雑な手続きの為、何回も調べ直さなければならないことがありました。これを防ぐ為に簡単にまとめた内容を記載します。
複数列の取得
DataTable から必要な項目のみを取得
※あまり使う機会はないかもしれないが…
DataTable member = new DataTable();
member.Columns.Add("No", typeof(int));
member.Columns.Add("Name", typeof(string));
member.Columns.Add("Age", typeof(int));
member.Rows.Add(1, "太郎", 20);
member.Rows.Add(2, "次郎", 15);
member.Rows.Add(3, "三郎", 10);
var datas =
member.AsEnumerable()
.Select(x => new { Name = x["Name"], Age = x["Age"] });
foreach (var data in datas)
Console.WriteLine("Name:{0},Age:{1}", data.Name, data.Age);
簡単な説明
- Selectにnew演算子をセット後、キー名及び値となるDataTableの項目(列の名前)をセットします。
- 複数ある場合はカンマで区切ります。
- ”x =>”の x は何でも良かったりします。
出力結果
Name:太郎,Age:20
Name:次郎,Age:15
Name:三郎,Age:10
条件に合ったデータの取得
DataTable から条件に合ったレコードを取得
※ループやif文条件を使うよりは、SQLに慣れているとこちらの方が見やすいかな…
DataTable member = new DataTable();
member.Columns.Add("No", typeof(int));
member.Columns.Add("Name", typeof(string));
member.Columns.Add("Age", typeof(int));
member.Rows.Add(1, "太郎", 20);
member.Rows.Add(2, "次郎", 15);
member.Rows.Add(3, "三郎", 10);
// rowsで結果を取得
DataRow[] rows =
member.AsEnumerable()
.Where(x => (int)x["Age"] > 10)
.ToArray();
Console.WriteLine("rowsで結果を取得");
foreach (DataRow row1 in rows)
Console.WriteLine("No:{0},Name:{1},Age:{2}", row1["No"], row1["Name"], row1["Age"]);
// dataTableで結果を取得
DataTable dataTable =
member.AsEnumerable()
.Where(x => (int)x["Age"] > 10)
.CopyToDataTable();
Console.WriteLine("");
Console.WriteLine("dataTableで結果を取得");
foreach (DataRow row2 in dataTable.Rows)
Console.WriteLine("No:{0},Name:{1},Age:{2}", row2["No"], row2["Name"], row2["Age"]);
簡単な説明
- Whereに取得条件をセットします。
- 結果を格納する変数の型を2パターン記述してみました。
出力結果
rowsで結果を取得
No:1,Name:太郎,Age:20
No:2,Name:次郎,Age:15dataTableで結果を取得
No:1,Name:太郎,Age:20
No:2,Name:次郎,Age:15
おわりに
LINQは何かと使い勝手が良いと思います。
ただ、暫くコードを書いていないと、ふと書き方を忘れてしまうなと感じております。
この記事は備忘録的な意味合いが強く、詳しい説明などは記載しておりません。
「こんな事が出来るんだ」程度に見て頂ければ幸いです。
今回は初回として、記事としてはここまでになります。
今後、内容を追記していければと考えております。