德露西亚,
我不确定您正在寻找哪种答案/解决方案,因为一方面您说您严重依赖类型化的数据集,但随后您想摆脱它们。:)
因此,我将尝试通过提供我过去使用过的解决方案来回答您的问题,所以就这样吧。
/// <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,因为该类是自动生成的类,它的字段直接映射到数据库中的表或 stroed proc。
您可以通过以下方式之一使用它:
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;
}
}