Symfoware

Symfowareについての考察blog

C#(mono)DataTableのフィールド値をキーにDictionaryへ変換

データベースからデータを取り出し。
プライマリキーな値を連想配列のキーとしてキャッシュを作成して使いたい。

辞書型へ変換するとき、ループせずにLinqで変換できないか調べてみました。
環境はDebian + Monoです。
Debian 8(jessie)にapt-getでmonoをインストール
C# LINQ の使い方(Select, Where, OrderBy, OrderByDescending, Aggregate)


AsEnumerable



System.Data.DataSetExtensions.dllのAsEnumerable。
DataTableExtensions.AsEnumerable メソッド (DataTable)

これが使えそうなのですが、Monoでの使い方がわからず。
こんなエラーになります。


sample.cs(31,35): error CS1929: Type `System.Data.DataRowCollection' does not contain a member `AsEnumerable' and the best extension method overload
`System.Data.TypedTableBaseExtensions.AsEnumerable<System.Data.DataRow>(this System.Data.TypedTableBase<System.Data.DataRow>)' requires an instance of type `System.Data.TypedTableBase<System.Data.DataRow>'
/usr/lib/mono/4.5/System.Data.DataSetExtensions.dll (Location of the symbol related to previous error)
Compilation failed: 1 error(s), 0 warnings




諦めてSelectで代用しました。




ToDictionary




こちらで登録したデータを検索。
辞書型に変換してみます。
Debian 8(jessie) + C#(Mono)でSQL Server 2016に接続する


サンプルはこのようになりました。


  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. public class Sample {
  7.     
  8.     static public void Main () {
  9.         
  10.         // 接続文字列
  11.         string connectString = "Data Source=192.168.1.104;";
  12.         connectString += "Initial Catalog=sample;";
  13.         connectString += "User ID=sa;";
  14.         connectString += "Password=P@ssw0rd;";
  15.         connectString += "Trusted_Connection=False;";
  16.         
  17.         DataTable dt = new DataTable();
  18.         
  19.         // データベースに接続
  20.         using (SqlConnection con = new SqlConnection(connectString)) {
  21.             
  22.             using (SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM t1", con)) {
  23.                 // 検索結果をDataTableに退避
  24.                 da.Fill(dt);
  25.             }
  26.             
  27.         }
  28.         
  29.         //System.Data.DataSetExtensions.dllのAsEnumerableが使えそうだが
  30.         //Monoでの使い方がわからない。
  31.         
  32.         //DataRow[] rows = dt.Select();
  33.         //Dictionary<int, DataRow> = rows.ToDictionary(row => row["id"]);
  34.         // 上記を1行で書くとこうなる
  35.         Dictionary<int, DataRow> dic = dt.Select().ToDictionary(row => (int)row["id"]);
  36.         
  37.         // キーを指定してデータを取り出し
  38.         DataRow dr = dic[1];
  39.         Console.WriteLine("value:{0}", dr["value"]);
  40.         
  41.         Console.WriteLine("value:{0}", dic[2]["value"]);
  42.     }
  43. }




実行結果


# ./sample.exe
value:C#からデータ更新
value:新しい行を追加




狙い通りの動作です。


関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/10/04(火) 23:48:38|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Windows Server 2016 にIIS 10.0をインストールし、ASP.NETを有効化 | ホーム | Debian 8(jessie) + C#(Mono)でSQL Server 2016に接続する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1930-16f240d1
この記事にトラックバックする(FC2ブログユーザー)