Заполнение родительских + дочерних объектов из SQL Server 2008 (через XML?) - PullRequest
1 голос
/ 11 августа 2010

У меня есть простой DAL, который состоит из объекта SalesEnquiry, который включает в себя List<T> объекта Vehicle, который используется для обработки входящих запросов (XML) и записи их в БД. Пока все хорошо.

Однако я пишу другое приложение, которое дополнительно обрабатывает данные в этой БД, поэтому я хочу использовать те же объекты DAL для извлечения и манипулирования данными.

Вместо того, чтобы возвращать обычные наборы записей и повторять их, заполняя вручную каждое свойство объектов 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?

Обновление:

Исходя из предложений Шунти, я использую следующее:

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 ...

Ответы [ 2 ]

1 голос
/ 11 августа 2010

Альтернатива с использованием 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 голос
/ 11 августа 2010

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

...