Gewusst wie: Projizieren eines neuen Typs (LINQ to XML)

Aktualisiert: November 2007

In anderen Beispielen dieses Abschnitts wurden Abfragen gezeigt, die Ergebnisse als eine IEnumerable<T> von XElement, eine IEnumerable<T> von string und eine IEnumerable<T> von int zurückgeben. Dabei handelt es sich zwar um gängige Ergebnistypen, die sich aber nicht für jedes Szenario eignen. In vielen Fällen besteht Ihr Ziel darin, dass Ihre Abfragen als eine IEnumerable<T> eines anderen Typs zurückgegeben werden.

Beispiel

In diesem Beispiel wird gezeigt, wie Sie Objekte in der select-Klausel instanziieren können. Der Code definiert zuerst mit einem Konstruktor eine neue Klasse und ändert anschließend die select-Anweisung so, dass der Ausdruck zu einer neuen Instanz der neuen Klasse wird.

In diesem Beispiel wird das XML-Dokument in XML-Beispieldatei: Typischer Auftrag (LINQ to XML) verwendet.

class NameQty {
    public string name;
    public int qty;
    public NameQty(string n, int q)
    {
        name = n;
        qty = q;
    }
};

class Program {
    public static void Main() {
        XElement po = XElement.Load("PurchaseOrder.xml");

        IEnumerable<NameQty> nqList =
            from n in po.Descendants("Item")
            select new NameQty(
                    (string)n.Element("ProductName"),
                    (int)n.Element("Quantity")
                );

        foreach (NameQty n in nqList)
            Console.WriteLine(n.name + ":" + n.qty);
    }
}
Public Class NameQty
    Public name As String
    Public qty As Integer
    Public Sub New(ByVal n As String, ByVal q As Integer)
        name = n
        qty = q
    End Sub
End Class

Public Class Program
    Shared Sub Main()
        Dim po As XElement = XElement.Load("PurchaseOrder.xml")

        Dim nqList As IEnumerable(Of NameQty) = _
            From n In po...<Item> _
            Select New NameQty( _
                n.<ProductName>.Value, CInt(n.<Quantity>.Value))

        For Each n As NameQty In nqList
            Console.WriteLine(n.name & ":" & n.qty)
        Next
    End Sub
End Class

Dieses Beispiel verwendet die M:System.Xml.Linq.XElement.Element-Methode, die im Thema Gewusst wie: Abrufen eines einzelnen untergeordneten Elements (LINQ to XML) eingeführt wurde. Außerdem verwendet das Beispiel Umwandlungen, um die Werte der Elemente abzurufen, die von der M:System.Xml.Linq.XElement.Element-Methode zurückgegeben werden.

Dieses Beispiel führt zur folgenden Ausgabe:

Lawnmower:1
Baby Monitor:2

Siehe auch

Konzepte

Projektionen und Transformationen (LINQ to XML)