Como: Um tipo de projeto anônima
Em alguns casos você pode querer projetar uma consulta a um novo tipo, mesmo que você soubesse que você usará apenas este tipo para um curto quando. É muito trabalho adicional para criar apenas um novo tipo para usar na projeção. Uma abordagem mais eficiente nesse caso é projeto para um tipo anônimo. Tipos anônimos permitem que você defina uma classe, então declare e inicialize um objeto de aquela classe, sem dar um nome para a classe.
Tipos anônimos são a implementação de C# conceito de matemático de um tuple. O tuple o termo matemático proveniente da sequência única, double, triplo, quádruplo, quintuple, n- tuple. Refere-se a uma sequência finito rotuladas de objetos, cada um de um tipo específico. Isso é às vezes chamado uma lista de pares nome/valor. Por exemplo, o conteúdo de um endereço no documento XML Ordem de compra típico podem ser expressos como segue:
Name: Ellen Adams
Street: 123 Maple Street
City: Mill Valley
State: CA
Zip: 90952
Country: USA
Quando você cria uma instância de um tipo anônimo, é conveniente pensar nele como criar um tuple de Em ordem. Se você escrever uma consulta que cria um tuple na cláusula select , a consulta retorna IEnumerable de tuple.
Exemplo
Nesse exemplo, a cláusula de select projetos de um tipo anônimo. O exemplo usa em var para criar o objeto de IEnumerable . Dentro do loop de foreach , a variável de iteração torna-se em uma instância do tipo anônimo criado na expressão de consulta.
Este exemplo usa o seguinte documento XML: Arquivo XML de exemplo: clientes e pedidos (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
Esse código gera a seguinte saída:
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