aus T-SQL XML RAW eine Datasource für den asp:repeater erzeugen

Executive Summary:
Um was geht es in diesem Beitrag:
Inhaltsverzeichnis
Matthias Weber ist Unternehmer, C-Level-Coach und Buchautor von „Datengetriebenes Marketing – Mit dem OCEAN-Modell die Big-Five-Persönlichkeitsmerkmale zielgerichtet nutzen“. Er ist überzeugt: Die meisten Unternehmen scheitern nicht an Technologie – sondern an fehlender Klarheit. Deswegen arbeitet er in seinen Mandaten immer an der Schnittstelle von Technologie, Mindset und Führung und daran, warum echte Entwicklung immer beim Denken beginnt.
 

Im Rahmen unseres Entwicklungs-Mandats für einen mittelständisches Systemhaus mit eigenem Webshop-Produkt, haben wir uns intensiv mit dem repeater-Control von ASP.net beschäftigen dürfen.

Die Herausforderung bestand in einem geschachtelten Repeater. Das klassische Problem lautete: Angebote mit den jeweiligen Angebotspositionen darzustellen. Dazu haben wir die XML-Funktion von T-SQL (SQL Server) genutzt. Die notwendigen Positionsdaten werden als Spalte in dem Angebot, formatiert als RAW-XML, aus der Datenbank geholt:

SELECT 
 OfferPos_P.s_PosNo OfferPos_PosNo,
 OfferPos_P.s_ItemDesc1 OfferPos_ItemDesc1,
 OfferPos_P.N_PACKQUANTITY OfferPos_PackQuantity
FROM 
 sao.OFFERPOS_P with (Nolock)
 WHERE
 OFFERPOS_P.dt_deleted IS NULL
 AND OFFERPOS_P.I_OFFER_P = @nOfferID
FOR XML RAW

Innerhalb des 1. Repeater beinhaltet dann diese Spalte die passenden Positions-Daten. Dieses XML wird dann mit einer kleinen Funktion in eine IEnumerable-Datasource umgewandelt:

public IEnumerable<offerPos> CreateOfferPosDataSource(object xmlData)
 {
 XDocument doc = XDocument.Parse($"<?xml version=\"1.0\"?>{xmlData.ToString()}");
 IEnumerable<offerPos> result = from c in doc.Descendants("row")
 select new offerPos()
 {
 posNo = (string)c.Attribute("OfferPos_PosNo").Value,
 itemDesc1 = (string)c.Attribute("OfferPos_ItemDesc1").Value,
 packQuantity = (decimal)c.Attribute("OfferPos_PackQuantity")
 };
 return result;
 }

Am Ende kann dann diese Datasource für den zweiten Repeater genutzt werden.

<asp:Repeater runat="server" DataSource='<%# CreateOfferPosDataSource(Eval("offerpos_xml")) %>'>
 <ul>
 <ItemTemplate>
 <li><%# Eval("posNo") %>: <%# Eval("itemDesc1") %></li>
 </ul>
 </ItemTemplate>
 
 </asp:Repeater>

Cool oder?

weitere insights