若要有效编写查询,应了解完整的查询操做中的变量类型是如何所有彼此关联的。 若是了解这些关系,就可以更容易地理解文档中的 LINQ 示例和代码示例。 另外,还能了解在使用 var
隐式对变量进行类型化时的后台操做。html
LINQ 查询操做在数据源、查询自己及查询执行中是强类型化的。 查询中变量的类型必须与数据源中元素的类型和 foreach
语句中迭代变量的类型兼容。 此强类型保证在编译时捕获类型错误,以即可以在用户遇到这些错误以前更正它们。spa
为了演示这些类型关系,下面的大多数示例对全部变量使用显式类型。 最后一个示例演示在利用使用 var 的隐式类型时,如何应用相同的原则。3d
下图演示不对数据执行转换的 LINQ to Objects 查询操做。 源包含一个字符串序列,查询输出也是一个字符串序列。code
数据源的类型参数决定范围变量的类型。htm
所选对象的类型决定查询变量的类型。 此处的 name
是一个字符串。 所以,查询变量是一个 IEnumerable<string>
。对象
在 foreach
语句中循环访问查询变量。 由于查询变量是一个字符串序列,因此迭代变量也是一个字符串。blog
下图演示对数据执行简单转换的 LINQ to SQL 查询操做。 查询将一个 Customer
对象序列用做输入,并只选择结果中的 Name
属性。 由于 Name
是一个字符串,因此查询生成一个字符串序列做为输出。开发
数据源的类型参数决定范围变量的类型。文档
select
语句返回 Name
属性,而非完整的 Customer
对象。 由于 Name
是一个字符串,因此 custNameQuery
的类型参数是 string
,而非 Customer
。字符串
由于 custNameQuery
是一个字符串序列,因此 foreach
循环的迭代变量也必须是 string
。
下图演示稍微复杂的转换。 select
语句返回只捕获原始 Customer
对象的两个成员的匿名类型。
数据源的类型参数始终为查询中范围变量的类型。
由于 select
语句生成匿名类型,因此必须使用 var
隐式类型化查询变量。
由于查询变量的类型是隐式的,因此 foreach
循环中的迭代变量也必须是隐式的。
虽然须要了解查询操做中的类型关系,可是也能够选择让编译器执行所有工做。 关键字 var可用于查询操做中的任何本地变量。 下图与前面讨论的第二个示例类似。 可是,编译器为查询操做中的各个变量提供强类型。