Pregunta

Tengo DAL simple que consiste en un objeto SalesEnquiry, que incluye un List<T> de un objeto Vehicle, que se utiliza para procesar las peticiones entrantes (XML) y escribirlos en una base de datos. Hasta aquí todo bien.

Sin embargo, estoy escribiendo otra aplicación que procesa los datos adicionales en este DB, así que estoy con ganas de utilizar estos mismos objetos DAL para recuperar y manipular los datos.

En lugar de regresar de registros convencionales y la iteración a través de ellos, poblar manualmente cada propiedad de la SalesEnquiry / Vehículo de objetos, pensé que podría devolver los datos de SQL Server como XML y de-serializar ella. Ya utilizo esta técnica para manejar los datos entrantes en el primer lugar.

Sin embargo, no estoy seguro de si / cómo puedo construir el XML adecuado en SQL Server o si he de hacerlo en dos etapas.

A continuación se va a extraer las consultas como XML:

Select EnquiryID as 'enquiry/enquiryid',
     EnquiryNo as 'enquiry/enquiryno',
     CompanyName as 'enquiry/company'
From Enquiries e
Where e.EnquiryID = 23
For XML PATH

Y lo siguiente que va a extraer los vehículos asociados como XML:

Select VehicleID as 'vehicle/vehicleid',
    VehicleReg as 'vehicle/vehiclereg'
From Vehicles v
Where v.EnquiryID= 23
For XML PATH

El XML resultante yo después es:

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

¿Puedo crear en SQL Server, o tengo que hacer manualmente esto en mi DAL?

Actualización:

A raíz de las sugerencias de Shunty, estoy usando la siguiente:

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

.. puedo estar cerca, pero no estoy muy allá:

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

Para deserializar éxito, necesito mis elementos <vehicle> a venir bajo un elemento <vehicles> padres. Tiene que haber una manera de animar a SQL para elaborar el XML correcto ...

¿Fue útil?

Solución

Una alternativa usando 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

Las devoluciones:

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

Otros consejos

Utilice unirse a un interior estándar y luego echar un vistazo a la AUTO (elementos) y palabras clave (en MSDN) para su cláusula FOR XML. Yo no lo he probado con exactitud pero sin duda parece ser lo que quiera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top