Заполнение родителя + дочерние объекты от SQL Server 2008 (через XML?)

У меня есть простой 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...

1
задан CJM 11 August 2010 в 11:05
поделиться

2 ответа

Альтернатива с использованием 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>
1
ответ дан 2 September 2019 в 22:16
поделиться

Используйте стандартное внутреннее соединение, а затем обратите внимание на ключевые слова AUTO (и ELEMENTS) (в MSDN) для вашего предложения FOR XML. Я точно не пробовал, но это определенно похоже на то, что вам нужно.

1
ответ дан 2 September 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: