如何:投影匿名类型
在某些情况下,您可能需要将查询投影到新类型,即使您知道只是短时间使用此类型。创建仅在投影中使用的新类型需要大量额外工作。在这种情况下,一种更有效的方法是投影到匿名类型。匿名类型允许您定义一个类,然后在不给出类名称的情况下声明并初始化该类的对象。
匿名类型是“元组”这一数学概念的 C# 实现。数学术语元组源自序列单元组、双元组、三元组、四元组、五元组和 n 元组。它指有限的对象序列,每个对象具有特定的类型。有时,它称为名称/值对的列表。例如,典型采购订单 XML 文档中某一地址的内容可表示为如下形式:
Name: Ellen Adams
Street: 123 Maple Street
City: Mill Valley
State: CA
Zip: 90952
Country: USA
在创建匿名类型的实例时,可以将其想像为创建 n 阶元组。如果编写一个将在 select 子句中创建元组的查询,该查询将返回该元组的一个 IEnumerable。
示例
在此示例中,select 子句投影一个匿名类型。然后,示例使用 var 创建 IEnumerable 对象。在 foreach 循环中,该迭代变量成为在查询表达式中创建的匿名类型的实例。
本示例使用下面的 XML 文档:示例 XML 文件:Customers 和 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
这段代码产生以下输出:
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