2

FetchData以下の方法を検討してください。これは、データベースからデータをフェッチするたびにデータベースクエリコードが重複しないように設計されています。

List<MyData> myData = new List<MyData();
FetchData((IDataReader reader) =>
   {
       myData.Add(new MyData(reader.GetString(0), reader.GetInt32(1)));
   }, "usp_get_my_data");

FetchDataそれは機能しますが、このオブジェクトの作成が何らかの形でメソッド内に存在することができれば素晴らしいでしょう。

より良いアプローチはありますか?

おそらくFetchData、X型のリストを直接返すように変更できますか?

protected void FetchData(Action<IDataReader> processor, String query)
{
    using (var connection = CreateConnection())
    {
        connection.ConnectionString = ConnectionString;
        connection.Open();

        using (var command = connection.CreateCommand())
        {
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = query;

            using (IDataReader reader = command.ExecuteReader())
            {
                while (reader.read())
                {
                    processor(reader);
                }
            }
        }
    }
}
4

2 に答える 2

2

多分ジェネリックを使用していますか?

protected IEnumerable<T> FetchData<T>(Func<IDataReader, T> processor, String query)
{
    using (var connection = CreateConnection())
    {
        connection.ConnectionString = ConnectionString;
        connection.Open();

        using (var command = connection.CreateCommand())
        {
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = query;

            using (IDataReader reader = command.ExecuteReader())
            {
                while (reader.read())
                {
                    yield return processor(reader);
                }
            }
        }
    }
}

次に、列挙を好きなように使用できます。

var myData = FetchData<MyData>(reader => new MyData(reader.GetString(0), reader.GetInt32(1)), "usp_get_my_data").ToList();
于 2012-09-14T12:14:59.600 に答える
1

3 つの異なるヘルパーを持つ単一ファイル ORM であるDapper.Netをご覧ください。

  1. クエリを実行し、結果を厳密に型指定されたリストにマップします
  2. クエリを実行し、動的オブジェクトのリストにマップします
  3. 結果を返さないコマンドを実行する

この miro-ORM を構築するために使用された設計パターンは非常に役に立ちます。Dapper.Net は現在 StackOverflow で使用されています。

于 2012-09-14T12:28:37.680 に答える