【问题标题】:Populating parent + child objects from SQL Server 2008 (via XML?)从 SQL Server 2008 填充父 + 子对象(通过 XML?)
【发布时间】:2010-08-11 10:27:00
【问题描述】:

我有一个简单的 DAL,它由一个 SalesEnquiry 对象组成,其中包括一个 List<T> 的一个 Vehicle 对象,用于处理传入的查询 (XML) 并将它们写入数据库。到目前为止一切顺利。

但是,我正在编写另一个应用程序来进一步处理这个数据库中的数据,所以我想使用这些相同的 DAL 对象来检索和操作数据。

与其返回传统的记录集并遍历它们,手动填充 SalesEnquiry/Vehicle 对象的每个属性,我认为我可以将 SQL Server 中的数据作为 XML 返回并对其进行反序列化。我已经使用这种技术来处理传入的数据。

但是,我不确定是否/如何在 SQL Server 中构造适当的 XML,或者是否必须分两个阶段进行。

以下将查询提取为 XML:

Select EnquiryID as 'enquiry/enquiryid',
     EnquiryNo as 'enquiry/enquiryno',
     CompanyName as 'enquiry/company'
From Enquiries e
Where e.EnquiryID = 23
For XML PATH

以下内容会将相关车辆提取为 XML:

Select VehicleID as 'vehicle/vehicleid',
    VehicleReg as 'vehicle/vehiclereg'
From Vehicles v
Where v.EnquiryID= 23
For XML PATH

我所追求的结果 XML 是:

<?xml version="1.0" encoding="utf-8"?>
<enquiry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <enquiry_id>123</enquiry_no>
  <enquiry_no>100004</enquiry_no>
  <company>MyCompany</company>
  <enquiry_no>100004</enquiry_no>
  <vehicles>
    <vehicle>
      <vehicle_registration>ABC123</vehicle_registration>
    </vehicle>
    <vehicle>
      <vehicle_registration>XYZ789</vehicle_registration>
    </vehicle>
  </vehicles>
</enquiry>

我可以在 SQL Server 中创建它,还是必须在我的 DAL 中手动创建?

更新:

根据 Shunty 的建议,我正在使用以下内容:

Select enquiry.EnquiryID as enquiry_id, enquiry.EnquiryNo, enquiry.CompanyName, VehicleID as [vehicle.vehicle_id], VehicleReg as [vehicle.vehicle_registration]
From Enquiries as enquiry
inner join Vehicles on Vehicles.EnquiryID = enquiry.EnquiryID
Where enquiry.EnquiryID = 23
For XML AUTO, ELEMENTS

..我可以靠近,但我不完全在那里:

<?xml version="1.0" encoding="utf-8"?>
<enquiry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <enquiry_id>123</enquiry_no>
  <enquiry_no>100004</enquiry_no>
  <company>MyCompany</company>
  <enquiry_no>100004</enquiry_no>
    <vehicle>
      <vehicle_registration>ABC123</vehicle_registration>
    </vehicle>
    <vehicle>
      <vehicle_registration>XYZ789</vehicle_registration>
    </vehicle>
</enquiry>

要成功反序列化,我需要将我的 &lt;vehicle&gt; 元素置于 &lt;vehicles&gt; 父元素之下。必须有一种方法来鼓励 SQL 制作正确的 XML...

【问题讨论】:

    标签: c# sql-server xml xml-serialization xml-deserialization


    【解决方案1】:

    使用 XML PATH 的替代方法:

    SELECT
      EnquiryID AS enquiry_id,
      EnquiryNo AS enquiry_no,
      CompanyName AS company,
      (
        SELECT
          VehicleReg AS vehicle_registration
        FROM Vehicles
        WHERE EnquiryID = e.EnquiryID
        FOR XML PATH ('vehicle'), TYPE, ROOT('vehicles')
       )
    FROM Enquiries e 
    WHERE EnquiryID = 123
    FOR XML PATH ('enquiry'), TYPE
    

    返回:

    <enquiry>
      <enquiry_id>123</enquiry_id>
      <enquiry_no>100004</enquiry_no>
      <company>MyCompany</company>
      <vehicles>
        <vehicle>
          <vehicle_registration>ABC123</vehicle_registration>
        </vehicle>
        <vehicle>
          <vehicle_registration>XYZ789</vehicle_registration>
        </vehicle>
      </vehicles>
    </enquiry>
    

    【讨论】:

    • 我可以吻你……但我不会。 :) 我看过 Root(),但可以弄清楚如何使用它——我没有想到子查询。谢谢。
    【解决方案2】:

    使用标准内部联接,然后查看 FOR XML 子句的 AUTO(和 ELEMENTS)关键字(在 MSDN 上)。我还没有完全尝试过,但它看起来确实是你想要的。

    【讨论】:

    • 感谢 Shunty - 快到了,但还不完全!请参阅上面的更新。添加最终父元素的任何想法?
    • 我不得不承认它看起来应该是带有嵌套选择的路径,但我还不能完全理解它。
    • 我知道我已经被打败了。谢天谢地 - 我可以看到我的整个下午都消失了:-)
    • 一开始我认为 PATH 看起来很有希望,但后来你对 AUTO 的建议几乎让我到达了那里,在 8kb 让我摆脱了痛苦之前。无论如何感谢您的努力...
    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多