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