Cómo proyectar un nuevo tipo (LINQ to XML)
Actualización: November 2007
Otros ejemplos de esta sección han mostrado consultados que devuelven resultados como IEnumerable<T> de XElement, IEnumerable<T> de string y IEnumerable<T> de int. Se trata de tipos de resultados comunes, pero no son adecuados para cada caso. En muchos casos querrá que sus consultas devuelvan un IEnumerable<T> de algún otro tipo.
Ejemplo
En este ejemplo se muestra como crear instancias de objetos en la cláusula select. El código primero define una nueva clase con un constructor y después modifica la instrucción select para que la expresión sea una nueva instancia de la nueva clase.
Este ejemplo utiliza el siguiente documento XML: Archivo XML de muestra: pedido de compra típico (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
Este ejemplo utiliza el método M:System.Xml.Linq.XElement.Element que se presentó en el tema Cómo recuperar un único elemento secundario (LINQ to XML). También utiliza conversiones para recuperar los valores de los elementos devueltos por el método M:System.Xml.Linq.XElement.Element.
Este ejemplo genera el siguiente resultado:
Lawnmower:1
Baby Monitor:2