「FOR XML」データを使用した.NET XmlReader
-
10-07-2019 - |
質問
最近、会社では、現在のソリューションに統合する必要がある古いプロジェクトからMSSQLデータベースを入手しました。
データベースにはFOR XML AUTO句を使用する約100〜150のストアドプロシージャがあり、クエリは行ではなくXMLとして完全なオブジェクトグラフを返します。
(社内の私たちにとって)最速のソリューションは、データベースから返されたxmlデータに基づいて(xsd-toolを使用して)シリアライズ可能なクラスを作成することでした。
これは、これらのオブジェクトをインスタンス化するために使用するコードです:
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が大量のデータ(たとえば、多数の子、grandchildren、grandgrndchldrn ... objectsを含むオブジェクトの大きなコレクション)を返す場合、このメソッドの実行は非常に長く続きます。
アプリケーションのデータは今後も増え続けるため、これを最適化することを考えなければなりません。
それで、これが悪い習慣(FORXML、XmlReader、およびDeserializeを使用)か、ストアドプロシージャを書き換えてSqlDataReadersまたはLinq2Sqlを使用するか、このスニペット内に何らかのperf.issueがあるか(ジェネリックの不適切な使用)または他の何か)?
編集 大量のデータを一度にロードするのは悪い習慣であり、ロードプロセスを小さなチャンクに分割する必要があることは知っていますが、この特定のコードに何か問題があるのではないかと思っています。
解決
返されるXMLに含まれる の観点からこの問題を分析する必要があります。 XMLは、一度にメモリ内にある必要のないデータを返しますか?その後、すべてをメモリにデシリアライズすることはおそらく最良の方法ではありません。データを一度に少しだけ処理する必要がある場合は、XMLをXMLとして処理し、XmlReaderを少しずつ読み取っておく必要があります。