1. ホーム
  2. c#

[解決済み] DataReaderをList<T>に簡単に変換するには?重複

2022-07-12 01:42:34

質問

の中にデータを入れています。 DataReader に変換したい。 List<T> . このための可能な簡単な解決策は何ですか?

例えば、CustomerEntityクラスで、私はCustomerIdとCustomerNameプロパティを持っています。 List<CustomerEntity> .

どのように解決するのですか?

ReflectionとPropertiesまたはFieldの属性を使用して、DataReaderをオブジェクトにマッピングしているシステムを見たことがあります。 (LinqToSql が行うことに少し似ています。) これらは、タイピングを少し節約し、DBNull などのコーディング時のエラー数を減らすことができます。 一度、生成されたコードをキャッシュすれば、ほとんどの手書きのコードよりも速くなります。 を考慮してください。 を検討してください。

参照 "A Defense of Reflection in .NET" を参照してください。

すると、次のようなコードを書くことができます。

class CustomerDTO  
{
    [Field("id")]
    public int? CustomerId;

    [Field("name")]
    public string CustomerName;
}

...

using (DataReader reader = ...)
{    
   List<CustomerDTO> customers = reader.AutoMap<CustomerDTO>()
                                    .ToList();
}

(AutoMap()は拡張メソッドです)


@Stilgar さん、ありがとうございます。 素晴らしい コメント

もし が可能です。 を使用したほうがよいでしょう。 NHibernate、EF、Linq to Sqlなど。 しかし、古いプロジェクトでは(あるいは、「ここで発明されたものではない」、「ストアドプロックへの愛」など、他の(時には正当な)理由により)ORMを使用することが常に可能とは限らないので、より軽量のシステムを「袖の下」として持っていると役に立つことがある。

IDataReader のループをたくさん書く必要があった場合、コーディング (とエラー) を減らす利点がわかります。 アーキテクチャを変更することなく を減らすことができます。 それは、それが最初から良いアーキテクチャであると言っているわけではありませんが...。

CustomerDTOはデータアクセス層から出ず、複合オブジェクトなどはデータアクセス層がDTOオブジェクトを使って構築することを想定しているのですが、どうでしょうか?


この回答を書いてから数年後 ダッパー は.NETの世界に入り、それはあなたのAutoMapperを書くための非常に良い出発点である可能性があります。