デルシア、
一方で、型付きデータセットに大きく依存しているが、それらを取り除きたいと言っているため、探している回答/ソリューションの種類がわかりません。:)
そこで、私が過去に使用したソリューションを提供することで、あなたの質問に答えようとします。
/// <summary>
///This class is a wrapper around a DataTable,
///Associated with the stored procedure - usp_GET_FEATURES
///This class provides a strongly typed interface to access data from the DataTable
///containing the result of the given stored procedure.
/// </summary>
public class FeaturesDtw : BaseDataTableWrapper
{
public Int32 Id { get { return (Int32)DataRow[0]; } }
public String Title { get { return (String)DataRow[1]; } }
public String ShortDesc { get { return (String)DataRow[2]; } }
public String Description { get { return (String)DataRow[3]; } }
public String ImageFilePath { get { if (DataRow[4] != DBNull.Value) return (String)DataRow[4]; else return default(String); } }
public String ImageFileName { get { if (DataRow[5] != DBNull.Value) return (String)DataRow[5]; else return default(String); } }
public String ImageMimeType { get { if (DataRow[6] != DBNull.Value) return (String)DataRow[6]; else return default(String); } }
public DateTime DateCreated { get { return (DateTime)DataRow[7]; } }
public FeaturesDtw()
:base()
{
}
public FeaturesDtw(DataRow row)
:base(row)
{
}
}
上記のクラスは、私が DataTable ラッパーと呼んでいるものです。基本的に、クラスが自動生成されたクラスであり、そのフィールドがデータベース内のテーブルまたはストローブ プロシージャに直接マップされるという点で、強力な型の方法で DataTable を操作する機能が提供されます。
次のいずれかの方法で使用できます。
var dt = DataModule.GetFeaturesDataSet().Tables[0];
FeatureDtw featureDtw = new FeatureDtw();
foreach(DataRow row in dt.Rows)
{
featureDtw.DataRow = row;
var id = featureDtw.Id;
var title = featureDtw.Title;
}
上記のコードでは、DAL から DataTab (変数 dt) を取得し、ラッパーを使用して厳密に型指定された方法でフィールドを取得します。
また
private IEnumerable<T> GetEnumerableDtw<T>(DataTable dt) where T : BaseDataTableWrapper, new()
{
foreach (DataRow row in dt.Rows)
{
var baseDataTableWrapper = new T();
baseDataTableWrapper.DataRow = row;
yield return baseDataTableWrapper;
}
}
上記のメソッドに dt 変数を渡して IEnumerable を取得し、通常の IEnumerable と同じように使用できますが、データが実際には DataTable から取得されている点が異なります。
どちらの場合も、強く型付けされています。もちろん、どちらの場合も、DataTable を使用してデータをポストバックするのではなく、データを抽出するだけであるという前提があります。
それが理にかなっていることを願っていますか?
基本クラスは以下のとおりです
/// <summary>
///This class Base Class for all DataTable Wrappers
/// </summary>
public class BaseDataTableWrapper
{
public DataRow DataRow { get; set; }
public BaseDataTableWrapper()
{
}
public BaseDataTableWrapper(DataRow row)
:this()
{
DataRow = row;
}
}