2012-02-04 11 views
2

Accessデータベースから大量のデータを読み込むために使用している次のクラスがあります。ベストプラクティス:データアクセスクラスの作成

public class ConnectToAccess 
{ 
    private readonly string _connectionString; 

    public ConnectToAccess(String connectionString) 
    { 
     _connectionString = connectionString; 
    } 

    public List<String> GetData(String sql) 
    { 
     var data = new List<String>(); 
     using (var connection = new OleDbConnection(_connectionString)) 
     { 
      using (var command = connection.CreateCommand()) 
      { 
       command.CommandText = sql; 
       command.CommandType = CommandType.Text; 
       connection.Open(); 
       using (var reader = command.ExecuteReader()) 
       { 
        if (reader != null && reader.HasRows) 
        while (reader.Read()) 
        { 
         data.Add(reader["First Name"] + " " + reader["Last Name"]); 
        } 
       } 
      } 
     } 
     return data; 
    } 
} 

このコードは正常に動作しており、正常にデータをデータベースから取得しています。しかし、GetData()メソッドをより動的にするために改良したいと思います。私は何とか各オブジェクトが返されたデータセットの列に関連するプロパティを持つ匿名オブジェクトのリストを返すようにしたいと思います。

私はしばらくの間、.Netでコーディングしてきましたが、まだ多くのコンセプトではかなり新しいです。データセットの列を最も効果的に反映する匿名オブジェクトのリストを作成する方法については、あまりよく分かりません。私はまた、私はこの場合に使用する戻り値の型がわからない、私は多分リストを考えています。次に、私はそれらの匿名のオブジェクトからデータを引き出し、必要な場所に転送するためにリフレクションを使用する必要があると思います。

誰でもこのパズルの重要な部分を私を助けることができるなら、私は最も義務づけられます。

+0

なぜ車輪の再発明。 Entity Frameworkまたはその他のORMを使用します。 –

+0

@JohnSaunders OPは彼がAccessを使用していると述べています。 EFはAccessをサポートしておらず、マッピングを行うためにORMをスローすることは過度のものです。 – Asti

答えて

4

戻り値の型として匿名型を使用することはできません。 なぜDataTableを返さないのですか? DataAdapterを使用して、プロセスをより簡単にすることさえできます。また、スキーマも得られます。

あなたはすべてのためのオブジェクトを得ることに主張する場合:

public IEnumerable<T> GetData(String sql, Func<DataReader, T> selector) 
{ 
    //code elided 

    while (reader.Read()) 
    { 
     yield return selector(reader); 
    }  
} 

今、あなたはセレクタでそれを使用することができます。

var people = GetData("Select * from People", reader => new Person { Name = reader{"Name"], Age = reader["Age"] }) 
people.Take(5); //first five records only 
関連する問題