Kürzlich, in der Firma haben wir einige MSSQL-Datenbank von einem alten Projekt, das wir in die aktuelle Lösung integrieren müssen..NET XmlReader mit 'FOR XML' Daten
Die Datenbank enthält etwa 100-150 gespeicherte Prozeduren, die FOR XML AUTO-Klausel verwenden, sodass Abfragen vollständiges Objektdiagramm als XML anstelle von Zeilen zurückgeben.
Die schnellste Lösung (für uns in der Firma) war das Erstellen serialisierbarer Klassen (mit xsd-tool) basierend auf den XML-Daten, die von der Datenbank zurückgegeben wurden.
Dies ist Code, den wir diese Objekte instatiate verwenden:
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-Datenbank-Klasse von Enterprise-Bibliothek darstellt.
Wenn sp viele Daten zurückgibt (zum Beispiel einige große Sammlung von Objekten mit vielen Kindern, Enkel, grandgrndchldrn ... Objekte darin) Ausführung dieser Methode dauert sehr lange.
Die Daten in der Anwendung werden surrtly weiter wachsen, und ich muss daran denken, dies zu optimieren.
Also, ich frage mich, ob dies schlechte Praxis ist (mit FORXML, XmlReader und Deserialize), oder wir sollten gespeicherte Prozeduren neu schreiben und SqlDataReaders oder Linq2Sql verwenden, oder es gibt einige perf.issue in diesem Snippet (unsachgemäße Verwendung von Generika oder etwas anderes)?
bearbeitet Ich weiß, dass es eine schlechte Praxis ist auf einmal große ammount von Daten zu laden, und ich weiß, dass Ladeprozess auf kleinere Stücke aufgeteilt werden soll, aber ich frage mich nur, wenn etwas nicht in Ordnung ist mit diesem bestimmten Stück Code.
Wie groß ist das XML? –
Gegenwärtig sind XML-Returns zwischen 1 MB und 5 MBs – m1k4