Procedura: proiettare un nuovo tipo (LINQ to XML)

Negli altri esempi di questa sezione sono state illustrate query che restituiscono risultati sotto forma di IEnumerable<T> di XElement, IEnumerable<T> di string e IEnumerable<T> di int. Si tratta di tipi di risultati comuni, ma non sono appropriati per tutti gli scenari. In molti casi le query dovranno restituire un oggetto IEnumerable<T> di un altro tipo.

Esempio

In questo esempio viene illustrato come creare istanze di oggetti nella clausola select. Nel codice viene innanzitutto definita una nuova classe con un costruttore, quindi viene modificata l'istruzione select in modo che l'espressione sia una nuova istanza della nuova classe.

Nell'esempio viene utilizzato il seguente documento XML: File XML di esempio: Typical Purchase Order (LINQ to XML)

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

Nell'esempio viene utilizzato il metodo M:System.Xml.Linq.XElement.Element illustrato nell'argomento Procedura: recuperare un singolo elemento figlio (LINQ to XML). Vengono inoltre utilizzati i cast per recuperare i valori degli elementi restituiti dal metodo M:System.Xml.Linq.XElement.Element.

L'output ottenuto eseguendo l'esempio è il seguente:

Lawnmower:1
Baby Monitor:2

Vedere anche

Concetti

Proiezioni e trasformazioni (LINQ to XML)