带有“FOR XML”数据的.NET XmlReader
-
10-07-2019 - |
题
最近,在公司我们从一些旧项目中获得了一些MSSQL数据库,我们必须将其集成到当前的解决方案中。
数据库有大约100-150个使用FOR XML AUTO子句的存储过程,因此查询将完整的对象图作为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返回大量数据时(例如,包含大量子节点,孙子节点,grandgrndchldrn ...对象的一些大对象集合),此方法的执行持续时间很长。
应用程序中的数据将继续增长,我必须考虑优化这一点。
所以,我想知道这是不好的做法(使用FORXML,XmlReader和Deserialize),或者我们应该重写存储过程并使用SqlDataReaders或Linq2Sql,或者在这个片段中有一些perf.issue(不当使用泛型或其他什么)?
修改强> 我知道一次加载大量数据是不好的做法,我知道加载过程应该分成更小的块,但我只是想知道这段特殊代码是否有问题。
解决方案
您需要根据返回的XML中的 来分析此问题。 XML是否一次性返回不需要在内存中的数据?然后将它全部反序列化到内存中可能不是最好的事情。如果您只需要一次处理一些数据,那么您应该将XML作为XML处理并保持XmlReader一次只读一点。
不隶属于 StackOverflow