Недавно в компании мы получили базу данных MSSQL из какого-то старого проекта, которую мы должны интегрировать в текущее решение.
База данных содержит около 100-150 хранимых процедур, в которых используется предложение FOR XML AUTO, поэтому запросы возвращают полный объект-граф в виде XML вместо строк.
Самым быстрым решением (для нас в компании) было создание сериализуемых классов (с помощью xsd-tool) на основе данных xml, возвращаемых из базы данных.
Это код, который мы используем для создания этих объектов:
public static T GetObjectFromXml<T>(DbCommand command)
{
SqlDatabase db = (SqlDatabase)DB;
XmlReader xmlReader = null;
T returnValue;
xmlReader = db.ExecuteXmlReader(command);
xmlReader.MoveToContent();
XmlSerializer serializer = new XmlSerializer(typeof(T));
returnValue = (T)serializer.Deserialize(xmlReader);
xmlReader.Close();
return returnValue;
}
БД представляет класс базы данных из корпоративной библиотеки.
Когда sp возвращает много данных (например, некоторую большую коллекцию объектов с множеством дочерних элементов, внуков, grandgrndchldrn ... объектов), выполнение этого метода длится очень долго.
Данные в приложении будут продолжать расти, и я должен подумать об их оптимизации.
Итак, мне интересно, является ли это плохой практикой (с использованием FORXML, XmlReader и Deserialize), или мы должны переписать хранимые процедуры и использовать SqlDataReaders или Linq2Sql, или в этом фрагменте есть некоторый perf.issue (неправильное использование обобщений или что-то еще)?
Редактировать
Я знаю, что неправильно загружать большое количество данных сразу, и я знаю, что процесс загрузки должен быть разбит на более мелкие куски, но мне просто интересно, если что-то не так с этим конкретным фрагментом кода.