LoginSignup
10
13

More than 5 years have passed since last update.

任意のオブジェクトの配列をDataTableに変換する

Last updated at Posted at 2017-04-25

本題

EntityFrameworkの返り値って配列ですよね。
DataGridViewのDataSourceはDataTableであってほしいですよね。ソートしたいし。

というわけで変換します。

IEnumerableExtention.cs
public static class IEnumerableExtention
{
    public static DataTable ConvertDataTable<T>(this IEnumerable<T> items)
    {
        var properties = typeof(T).GetProperties();
        var result = new DataTable();

        // テーブルレイアウトの作成
        foreach (var prop in properties)
        {
            result.Columns.Add(prop.Name, prop.PropertyType);
        }

        // 値の投げ込み
        foreach (var item in items)
        {
            var row = result.NewRow();
            foreach (var prop in properties)
            {
                var itemValue = prop.GetValue(item, new object[] { });
                row[prop.Name] = itemValue;
            }
            result.Rows.Add(row);
        }
        return result;
    }
}

使い方

適当にModelの配列作って実行するだけ。
余計なプロパティが入ってるとよろしくない動きをするかもしれない。

// その1 単純に変換
var table1 = default(DataTable)
using (var context = new DataContext())
{
    var tmp = context.Model1.ToArray();
    table = tmp.ConvertDataTable();
}

// その2 匿名型
// もちろんJoinとかの結果でも大丈夫
var table2 = default(DataTable)
using (var context = new DataContext())
{
    var tmp = context.Model2
            .Select(m => new { Column1 = m.Prop1, Column2 = m.Prop2 }).ToArray();
    table = tmp.ConvertDataTable();
}

後書き

リフレクションばりばりなので、実行効率はよくないと思います。
EntityFrameworkの返り値をDataGridViewに投げ込む時に一々変換処理書くのが面倒だっただけですしね。
ただ、匿名型でもしっかり変換かけられるのは地味に楽です。コーディング的な意味で。
そもそもWindowsFormでEntityFrameworkっていうのが多分ミスマッチ
とはいえ基本的にリテラル書かなくていい、だいたい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