Delucia,
Я не уверен, вид ответа/решения, который вы ищете, потому что, с одной стороны, вы говорите, что сильно полагаетесь на набранный набор данных, но затем вы хотите избавиться от них. :)
Итак, я постараюсь ответить на ваш вопрос, предоставив решение, которое я использовал в прошлом, поэтому здесь.
/// <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 в сильном стиле, поскольку класс является автоматически сгенерированным классом, его поля отображаются непосредственно в таблицу или обрабатываются 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;
}
В коде выше я получаю DataTab (переменная дт) от моего DAL, а затем я использую обертку, чтобы получить на месторождениях строго типизированный.
ИЛИ
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;
}
}
вы можете передать переменную дт с указанным выше способом и получить обратно 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;
}
}
Я не могу предложить любую помощь. Я был там и сделал это (с нуля). Я просто хотел сказать, что мне нравится этот вопрос. Типизированные наборы данных ADO.NET отлично смотрятся на поверхности, но реальная PITA в конечном счете. – Tergiver
Мне удалось создать полноценное приложение asp.net на основе типизированных наборов данных * и *, работавших как с сервером oracle, так и с sql-сервером. Поговорите о кластере! –