У меня есть простой DAL, который состоит из a SalesEnquiry
объект, который включает a List<T>
из a Vehicle
объект, который используется, чтобы обработать входящие запросы (XML) и записать им в DB.Пока все хорошо.
Однако я пишу другое приложение, которое далее обрабатывает данные в этом DB, таким образом, я желаю использовать эти тот же, DAL возражает, чтобы получить и управлять данными.
Вместо того, чтобы возвратить стандартный recordsets и выполнить итерации через них, вручную заполняя каждое свойство объектов SalesEnquiry/Vehicle, я думал, что мог возвратить данные из SQL Server как XML и десериализовать его. Я уже использую эту технику для обработки входящих данных во-первых.
Однако я не уверен, могу ли я создать соответствующий XML в SQL Server или если я должен сделать это на двух этапах.
Следующее извлечет запросы как 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>
элементы для прибытия под a <vehicles>
родительский элемент. Должен быть способ поощрить SQL обрабатывать правильный XML...
Альтернатива с использованием 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>
Используйте стандартное внутреннее соединение, а затем обратите внимание на ключевые слова AUTO (и ELEMENTS) (в MSDN) для вашего предложения FOR XML. Я точно не пробовал, но это определенно похоже на то, что вам нужно.