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

Executive Summary:
Um was geht es in diesem Beitrag:
Inhaltsverzeichnis

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