【发布时间】:2015-10-21 08:26:19
【问题描述】:
我需要从我的 SQL Server 数据库中加载一个大型对象及其所有子对象。
我很喜欢在查询中使用FOR XML,然后使用XmlReader,然后再将批次反序列化为所需的类,就像这样:
SELECT
MyClass.* ,
(SELECT
ChildClass1.[ID],
ChildClass1.[Description]
FROM
[dbo].[ChildClass1Table] ChildClass1
JOIN
dbo.LinkyTable lt ON lt.ChildClass1ID = ChildClass1.ID
WHERE
lt.CID = MyClass.ID
FOR XML AUTO, ROOT('ChildClass1'), TYPE, ELEMENTS),
(SELECT
ChildClass2.[ID], ChildClass2.[Description]
FROM
[dbo].[ChildClass1Table] ChildClass2
JOIN
dbo.LinkyTable2 lt2 ON lt.ChildClass2ID = ChildClass2.ID
WHERE
lt2.CID = MyClass.ID
FOR XML AUTO, ROOT('ChildClass2'), TYPE, ELEMENTS)
FROM
...etc - for a fair few more
C#代码:
using (System.Xml.XmlReader xmlr = cmd.ExecuteXmlReader())
{
if (xmlr.Read())
{
string xml = string.Empty;
while (xmlr.ReadState != System.Xml.ReadState.EndOfFile)
{
xml = xmlr.ReadOuterXml();
}
var serializer = new XmlSerializer(typeof(MyClass));
using (var stream = new StringReader(xml))
using (var reader = XmlReader.Create(stream))
{
MyClass b = (MyClass)serializer.Deserialize(reader);
return b;
}
}
}
这很好用,我真的没有任何问题——除了理想情况下我想使用存储库模式从数据库中获取我的所有对象并且宁愿使用 IDbConnection / IDbCommand 而不是使用 XmlReader 所必需的具体 SQL Server 类。
我的问题是,是否有另一种方法可以使用标准阅读器加载这些子对象(无需为每个子对象(和孙子类)多次往返数据库)?
谢谢
【问题讨论】:
标签: c# asp.net sql-server xml ado.net