2010-08-11 82 views
1

我有简单的DAL,它由一个SalesEnquiry对象,其中包括一个Vehicle对象,它是用来处理传入的查询(XML)的List<T>,并把它们写到数据库。到现在为止还挺好。填充母+子对象

但是,我正在编写另一个应用程序,以进一步处理此数据库中的数据,所以我想使用这些相同的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 ...

回答

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> 
+0

我可以吻你......但我不会。:) 我看了Root(),但可以弄清楚如何使用它 - 子查询不会发生在我身上。谢谢。 – CJM 2010-08-11 12:06:04

1

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

+0

感谢Shunty - 几乎没有,但不完全!看到我上面的更新。任何想法添加最终的父元素? – CJM 2010-08-11 11:00:38

+0

我必须承认它看起来应该是一个嵌套选择的路径,但我不能完全把我的头围绕它。 – shunty 2010-08-11 12:09:51

+0

我看到我已经被打败了。谢天谢地 - 我可以看到我整个下午都消失了:-) – shunty 2010-08-11 12:10:45