.NET XmlReader с данными «ДЛЯ XML»
-
10-07-2019 - |
Вопрос
Недавно в компании мы получили базу данных MSSQL из какого-то старого проекта, которую нам нужно интегрировать в текущее решение.
База данных содержит около 100-150 хранимых процедур, которые используют предложение FOR XML AUTO, поэтому запросы возвращают полный объектный граф в виде XML вместо строк.
Самым быстрым решением (для нас в компании) было создание сериализуемых классов (с помощью xsd-инструмента) на основе данных 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;
}
DB представляет собой класс базы данных из корпоративной библиотеки.
Когда sp возвращает много данных (например, какую-то большую коллекцию объектов с множеством дочерних объектов, внуков, grandgrndchldrn... объектов), выполнение этого метода длится очень долго.
Объем данных в приложении, несомненно, будет продолжать расти, и мне нужно подумать об оптимизации этого процесса.
Итак, мне интересно, является ли это плохой практикой (использование FORXML, XmlReader и Deserialize), или нам следует переписать хранимые процедуры и использовать SqlDataReaders или Linq2Sql, или в этом фрагменте есть какая-то проблема perf.sue (неправильное использование дженериков или что-то еще). ) ?
РедактироватьЯ знаю, что загружать большой объем данных одновременно — плохая практика, и я знаю, что процесс загрузки следует разбивать на более мелкие фрагменты, но мне просто интересно, не случилось ли что-то не так с этим конкретным фрагментом кода.
Решение
Вам необходимо проанализировать эту проблему с точки зрения того, что в возвращаемый XML.Возвращает ли XML данные, которые не обязательно должны находиться в памяти сразу?Тогда десериализовать все это в память, наверное, не самое лучшее.Если вам нужно обрабатывать данные только понемногу, то, возможно, вам следует обрабатывать XML как XML и держать XmlReader под рукой, чтобы читать понемногу.