Procédure : projeter un type anonyme
Dans certains cas, vous souhaiterez peut-être projeter une requête vers un nouveau type, bien que vous sachiez que vous n'utiliserez ce type que pendant une courte période.Il serait fastidieux de créer un nouveau type simplement pour l'utiliser dans la projection.Une approche plus efficace dans ce cas consiste à projeter vers un type anonyme.Les types anonymes vous permettent de définir une classe, puis de déclarer et d'initialiser un objet de cette classe sans donner de nom à la classe.
Les types anonymes sont l'implémentation C# du concept mathématique de tuple.Le terme mathématique tuple provenait à l'origine de la séquence simple, double, triple, quadruple, quintuple, n-tuple.Il fait référence à une séquence limitée d'objets, chacun d'un type spécifique.Parfois, on appelle cela une liste de paires nom/valeur.Par exemple, le contenu d'une adresse dans le document XML Commande fournisseur typique pourrait être exprimé de la façon suivante :
Name: Ellen Adams
Street: 123 Maple Street
City: Mill Valley
State: CA
Zip: 90952
Country: USA
Lorsque vous créez une instance d'un type anonyme, vous pouvez considérer que vous créez un tuple d'ordre n.Si vous écrivez une requête qui crée un tuple dans la clause select, la requête retourne un IEnumerable du tuple.
Exemple
Dans cet exemple, la clause select projette un type anonyme.L'exemple utilise ensuite var pour créer l'objet IEnumerable.Dans la boucle foreach, la variable d'itération devient une instance du type anonyme créé dans l'expression de la requête.
Cet exemple utilise le document XML suivant : Exemple de fichier XML : Clients et commandes (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
Ce code génère la sortie suivante :
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