Procedura: proiettare un tipo anonimo

In alcuni casi può necessario proiettare una query in un nuovo tipo, anche se è noto che questo tipo verrà utilizzato solo per un breve periodo di tempo. La creazione di un nuovo tipo solo per utilizzarlo nella proiezione implica molto lavoro supplementare. Un approccio più efficiente in questo caso consiste nella proiezione in un tipo anonimo. I tipi anonimi consentono di definire una classe, quindi dichiarare e inizializzare un oggetto di tale classe, senza assegnare un nome alla classe.

I tipi anonimi sono l'implementazione C# del concetto matematico di tupla. Il termine matematico tupla deriva dalla sequenza singolo, doppio, triplo, quadruplo, quintuplo, n-plo. Fa riferimento a una sequenza finita di oggetti, ognuno di un tipo specifico, denominata a volte elenco di coppie nome/valore. Ad esempio, il contenuto di un indirizzo nel documento XML Typical Purchase Order potrebbe essere espresso come segue:

Name: Ellen Adams
Street: 123 Maple Street
City: Mill Valley
State: CA
Zip: 90952
Country: USA

Quando si crea un'istanza di un tipo anonimo, è utile considerare questa operazione come la creazione di una tupla di n ordini. Se si scrive una query che crea una tupla nella clausola select, la query restituisce un oggetto IEnumerable della tupla.

Esempio

In questo esempio la clausola select proietta un tipo anonimo. Viene quindi utilizzato var per creare l'oggetto IEnumerable. All'interno del ciclo foreach la variabile di iterazione diventa un'istanza del tipo anonimo creata nell'espressione di query.

Nell'esempio viene utilizzato il seguente documento XML: File XML di esempio: Customers e Orders (LINQ to XML)

XElement custOrd = XElement.Load("CustomersOrders.xml");
var custList =
    from el in custOrd.Element("Customers").Elements("Customer")
    select new {
        CustomerID = (string)el.Attribute("CustomerID"),
        CompanyName = (string)el.Element("CompanyName"),
        ContactName = (string)el.Element("ContactName")
    };
foreach (var cust in custList)
    Console.WriteLine("{0}:{1}:{2}", cust.CustomerID, cust.CompanyName, cust.ContactName);
Dim custOrd As XElement = XElement.Load("CustomersOrders.xml")
Dim custList = _
    From el In custOrd.<Customers>.<Customer> _
    Select New With { _
        .CustomerID = el.@<CustomerID>, _
        .CompanyName = el.<CompanyName>.Value, _
        .ContactName = el.<ContactName>.Value _
    }
For Each cust In custList
    Console.WriteLine("{0}:{1}:{2}", cust.CustomerID, cust.CompanyName, cust.ContactName)
Next

L'output del codice è il 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

Vedere anche

Concetti

Proiezioni e trasformazioni (LINQ to XML)