10
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【C#】DataTable でのLINQの使い方(1)

Posted at

はじめに

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:15

dataTableで結果を取得
No:1,Name:太郎,Age:20
No:2,Name:次郎,Age:15

おわりに

LINQは何かと使い勝手が良いと思います。
ただ、暫くコードを書いていないと、ふと書き方を忘れてしまうなと感じております。

この記事は備忘録的な意味合いが強く、詳しい説明などは記載しておりません。
「こんな事が出来るんだ」程度に見て頂ければ幸いです。

今回は初回として、記事としてはここまでになります。
今後、内容を追記していければと考えております。

10
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?