2011-06-27 10 views
0

私はオブジェクトをDataTableに変換するユーティリティクラスを持っています。 DataTableからオブジェクトリストに変換する際に大量のデータを読み込む際に問題が発生しています。カスタム属性を使用して列情報を決定し、関連付ける。ここでは擬似コードです:数百行を持っていたDataTableの結果を得るためにDataTableをカスタムオブジェクトに変換する(逆も同様)

For each row in the table 
    For each property in an object 
     For each attribute on that property 
      If the attribute is our column information attribute 
       Grab the data from the table and insert the value into the objects property 
      End 
     End 
    End 
End 

が、しかし、このプロセスはを取っているが...、それはウェブアプリで簡単に受け入れられないのです。

私の質問は、DataTableと.NET(カスタム)データオブジェクトを、多くのリフレクションを必要とせずに前後に変換する簡単な方法があるかどうかです。この場合)?

編集:データオブジェクト自体の中で別の問題だったことが分かりました。それでも、リフレクションコールでローダーを少し最適化しました。ありがとうございました。

+0

実際のコードを投稿する必要があるかもしれません - あなたの問題は、その一部をキャッシュするのではなく、すべての単一の行に対してリフレクションコールを実行している可能性があります。いくつかのアイデアについては、この質問への回答を参照してください:http://stackoverflow.com/questions/1204748/cache-reflection-results-class-properties。 – patmortech

+0

そして、ValueInjectorに関するこの記事を、データテーブルとオブジェクト間のマッパーとしてチェックしてください:http://stackoverflow.com/questions/5462671/valueinjecter-and-datatable – patmortech

+0

私は合法的にコードを投稿できませんが、私はキャッシュしていませんでした。反射呼び出し。私は今それを試しています、うまくいけば、それは十分なページロード時間を得るために十分にスピードアップします。 – qJake

答えて

0

動的である必要がありますか?そうでない場合は、LINQ to DataSetsを使用できます。

from tr in table.AsQueryable() 
select new MyObject 
{ 
    A = tr.Field<string>("A"), 
    . 
    . 
} 

それ以外の場合は、反映に依存する必要があります。ループ内でタイプとプロパティ情報を取得していないことを確認してください。時間がかかることがあります。属性と同じこと:ループの前に属性を持つプロパティのインデックスを作成し、このプロパティ名のインデックスを使用して必要なプロパティを取得することを検討してください。このように、唯一の反映はオブジェクトへの値の設定です。

また、ASP.NETの非同期機能を使用して作業をオフロードしたり、並列拡張機能を使用して変換にマルチコア処理を使用することもできます。

+0

残念ながら、それは動的でなければなりません。これは実用的な機能であり、完全に抽象化されています。 – qJake

+0

OKをクリックし、オブジェクトの反射をループから外して、一度だけ行います。それは良いスタートです。 –

+0

ええ、私はちょうどそれをし、それはかなりまともな量でそれをスピードアップしました。提案していただきありがとうございます。 – qJake

関連する問題