Come controllare il tipo di una proiezione (LINQ to XML)
Proiezione è il processo di filtro di un set di dati, modificandone la forma e forse il relativo tipo. La maggior parte delle espressioni di query esegue proiezioni. La maggior parte delle espressioni di query in questa sezione restituisce il tipo IEnumerable<T> di XElement, ma è possibile creare raccolte di altri tipi. Questo articolo illustra come eseguire questa operazione.
Esempio: definire un nuovo tipo e scrivere una query che crea un IEnumerable di tale tipo
Nell'esempio seguente viene definito un nuovo tipo, Customer
, e l'espressione di query crea un'istanza di nuovi oggetti Customer
nella clausola Select
. Il tipo dell'espressione di query diventa quindi IEnumerable<T> di Customer
. Nell'esempio viene utilizzato il documento XML File XML di esempio: Clienti e ordini.
public class Customer
{
private string customerID;
public string CustomerID{ get{return customerID;} set{customerID = value;}}
private string companyName;
public string CompanyName{ get{return companyName;} set{companyName = value;}}
private string contactName;
public string ContactName { get{return contactName;} set{contactName = value;}}
public Customer(string customerID, string companyName, string contactName)
{
CustomerID = customerID;
CompanyName = companyName;
ContactName = contactName;
}
public override string ToString()
{
return $"{this.customerID}:{this.companyName}:{this.contactName}";
}
}
class Program
{
static void Main(string[] args)
{
XElement custOrd = XElement.Load("CustomersOrders.xml");
IEnumerable<Customer> custList =
from el in custOrd.Element("Customers").Elements("Customer")
select new Customer(
(string)el.Attribute("CustomerID"),
(string)el.Element("CompanyName"),
(string)el.Element("ContactName")
);
foreach (Customer cust in custList)
Console.WriteLine(cust);
}
}
Public Class Customer
Private customerIDValue As String
Public Property CustomerID() As String
Get
Return customerIDValue
End Get
Set(ByVal value As String)
customerIDValue = value
End Set
End Property
Private companyNameValue As String
Public Property CompanyName() As String
Get
Return companyNameValue
End Get
Set(ByVal value As String)
companyNameValue = value
End Set
End Property
Private contactNameValue As String
Public Property ContactName() As String
Get
Return contactNameValue
End Get
Set(ByVal value As String)
contactNameValue = value
End Set
End Property
Public Sub New(ByVal customerID As String, _
ByVal companyName As String, _
ByVal contactName As String)
CustomerIDValue = customerID
CompanyNameValue = companyName
ContactNameValue = contactName
End Sub
Public Overrides Function ToString() As String
Return String.Format("{0}:{1}:{2}", Me.CustomerID, Me.CompanyName, Me.ContactName)
End Function
End Class
Sub Main()
Dim custOrd As XElement = XElement.Load("CustomersOrders.xml")
Dim custList As IEnumerable(Of Customer) = _
From el In custOrd.<Customers>.<Customer> _
Select New Customer( _
el.@<CustomerID>, _
el.<CompanyName>.Value, _
el.<ContactName>.Value _
)
For Each cust In custList
Console.WriteLine(cust)
Next
End Sub
Nell'esempio viene prodotto l'output seguente:
GREAL:Great Lakes Food Market:Howard Snyder
HUNGC:Hungry Coyote Import Store:Yoshi Latimer
LAZYK:Lazy K Kountry Store:John Steel
LETSS:Let's Stop N Shop:Jaime Yorres