1

我有一个简单的 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>

为了成功反序列化,我需要我的元素位于父元素<vehicle>之下。<vehicles>必须有一种方法来鼓励 SQL 制作正确的 XML……

4

2 回答 2

1

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

于 2010-08-11T10:37:22.083 回答
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>
于 2010-08-11T11:51:50.630 回答