Linq学习笔记之复合的from子句

如果需要根据对象的一个成员进行筛选,而该成员本身是一个系列,就可以使用复合的from子句。如Racer类定义了一个属性Cars,其中Cars是一个字符串数组。

现在要筛选出驾驶法拉利的所有冠军,可以使用如下的Linq查询:

var ferrariDrivers = from r in Formula.GetChampions()

                     from c in r.Cars

                     where c == "Ferrari"

                     orderby r.LastName

                     select r.FirstName + " " + r.LastName;

第一个from子句访问Formula.GetChampions()方法返回的Racer对象,第二个from子句访问Racer类的Cars属性,以返回所有string类型的赛车,接着在where子句中使用

这些赛车筛选驾驶法拉利的所有冠军。

C#编译器把复合的from子句和Linq查询转换为SelectMany()扩展方法。修改后的Linq查询为:

var ferrariDrivers =

                Formula.GetChampions()

                .SelectMany(r => r.Cars, (r, c) => new { Racer = r, Car = c })

                .Where(r => r.Car == "Ferrari")

                .OrderBy(r => r.Racer.LastName)

                .Select(r => r.Racer.FirstName + " " + r.Racer.LastName);

 

你可能感兴趣的:(LINQ)