2017-02-06 1 views
0

私はList<MyViewModel>を返すメソッドを呼び出しており、それからDataTableを埋めたいと思っています。このメソッドは、そのリストフォームに必要ないくつかの場所で呼び出されるため、戻り値の型は変更できません。私はリストを反復して一度に1行で表を埋めることができることを知っていますが、.Loadのようなより洗練された解決策があることを望んでいましたiDataReaderの機能。リストからDataTableを簡単に埋め込む方法<Model>?

+1

ちょうど興味があります - あなたはなぜ光と読み取り可能な 'List 'を複雑な 'DataTable'オブジェクトに変換したいのですか? – Fabio

+0

Excelに情報をエクスポートするために使用するプラグインでは、受信データがDataTableに存在する必要があります。 – Matthew

+0

どのような解決策でもループが繰り返されるので、リスト内のすべての項目に対して行を追加する古典的なループは、単純なアプローチで済むと思います。 – Fabio

答えて

2

はコメントからは、本当の問題は、あなたがExcelファイルに強く型付けされたリストをエクスポートすることにあるようですが、あなたが使用するライブラリは、唯一のDataTableを受け付けます。

私は例えば、データテーブルとコレクションの両方からデータを読み込むことができ、あなたの代わりにEPPlusライブラリを使用することをお勧めしたい:

sheet.LoadFromDataTable(myTable); 

または

sheet.LoadFromCollection(myList); 

をEPPlusがあまりにもNuGet packageとして利用可能です。一般的に

、あなたは簡単に例えば、MoreLINQToDataTable()延長でのDataTableにコレクションを変換することができます:

var myTable=myList.ToDataTable(); 

あなたが拡張機能のコードhereを見つけることができます。 MoreLINQはa NuGet packageとしても利用可能です。

+0

ありがとうございます、あなたは私の意図で正しいです。私はEPPLusを見ていきます。私はまた、学習の場としてそれをもっと調べるためのリンクを見ていきます。 – Matthew

+0

その他のLINQはオープンソースです。 ToDataTable [ここ](https://github.com/morelinq/MoreLINQ/blob/master/MoreLinq/ToDataTable.cs)のソースを見つけることができます。 –

0
public DataTable TableFromMyViewModel(params MyViewModel[] items) 
{ 
    DataTable _result = new DataTable("MyViewModel"); 

    // Do this for each field 
    _result.Columns.Add("Field1", typeof(String)); 
    _result.Columns.Add("Field2", typeof(int)); 
    _result.Columns.Add("Field3", typeof(String)); 

    foreach (MyViewModel _item in items) 
    { 
     DataRow _row = _result.NewRow(); 
     _row["Field1"] = _item.Field1; 
     _row["Field2"] = _item.Field2; 
     _row["Field3"] = _item.Field3; 
     _result.Rows.Add(_row); 
    } 

    return _result; 
} 
+0

あなたは正解です、ありがとうございます。 – maksymiuk

関連する問題