.NET XmlReader с данными 'FOR XML' - PullRequest
1 голос
/ 24 июня 2009

Недавно в компании мы получили базу данных 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 (неправильное использование обобщений или что-то еще)?


Редактировать Я знаю, что неправильно загружать большое количество данных сразу, и я знаю, что процесс загрузки должен быть разбит на более мелкие куски, но мне просто интересно, если что-то не так с этим конкретным фрагментом кода.

1 Ответ

1 голос
/ 24 июня 2009

Вам необходимо проанализировать эту проблему с точки зрения того, что в возвращаемого XML. XML возвращает данные, которые не должны быть в памяти все сразу? Тогда десериализация всего этого в памяти, вероятно, не лучшая вещь. Если вам нужно только обрабатывать данные постепенно, то, возможно, вам следует обрабатывать XML как XML и держать XmlReader рядом, чтобы читать немного за раз.

...