class ShowAllUserNames { static void Main()//仅选择user对象名称的查询 { IEnumerable<string> query = from user in SampleData.AllUsers select user.Name; //query {System.Linq.Enumerable.WhereSelectListIterator<Model.User,string>} //我们使用user.Name作为投影,即可看到结果变为字符串序列,而不是User对象了。 //查询表达式的转换遵循与之前一样的规则,变为 //SampleData.AllUsers.Select(user => user.Name) //编译器准许这样做,由于从Enumerable所选择的Select扩展方法实际具有如下 //签名 //static IEnumerable<TResult> Select<TSource,TResult> // (this IEnumerable<TSource> source, // Func<TSource,TResult> selector) //将Lambda表达式转换为Func<TSource,TResult>的时候。 //首先根据SampleData.AllUsers的类型推断出TSource为User,这样就知道了 //Lambda表达式的参数类型,并因此将user.Name作为返回string类型的 //属性访问表达式,也就可以推断出TRsult为string。 Lambda表达式允许使用 //隐式类型参数的原因。 foreach (string name in query) //先foreach 后 query 后 in 然后 select user.Name in都会调用user.Name //后string name //"Tim Trotter" //"Tara Tutu" //"Deborah Denton" //"Darren Dahlia" //"Mary Malcop" //"Colin Carton" { Console.WriteLine(name); } } }
public static class Users { public static readonly User TesterTim = new User("Tim Trotter", UserType.Tester); public static readonly User TesterTara = new User("Tara Tutu", UserType.Tester); public static readonly User DeveloperDeborah = new User("Deborah Denton", UserType.Developer); public static readonly User DeveloperDarren = new User("Darren Dahlia", UserType.Developer); public static readonly User ManagerMary = new User("Mary Malcop", UserType.Manager); public static readonly User CustomerColin = new User("Colin Carton", UserType.Customer); }
public static IEnumerable<User> AllUsers { get { return users; } }
范围变量和重要的投影
上下文关键字 告知编译器要对数据进行的处理。 同样,数据源表达式也仅仅是普通
的C#表达式
范围变量不像其他种类的变量。在某些方面,它根本就不是变量。只能用于查询
表达式中,实际代表了从一个表达式传递给另外一个表达式的上下文信息。
它们表示了特定序列中的一个元素,而且它们被用于编译器转译中,便把其他
表达式轻易地转译为Lambda表达式
输出:
Tim Trotter
Tara Tutu
Deborah Denton
Darren Dahlia
Mary Malcop
Colin Carton