##本題
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で済む、というのは素晴らしいですよね。