在 from 开始子句以及 select 或 group 结束子句之间,所有其他子句(where、join、orderby、from、let)都是可选的。 任何可选子句都可以在查询正文中使用零次或多次。
where 子句使用 where 子句可以根据一个或多个谓词表达式筛选掉源数据中的某些元素。 以下示例中的 where 子句含有两个谓词。
IEnumerable<City > queryCityPop =
from city in cities
where city.Population < 200000 && city.Population > 100000
select city;
orderby 子句使用 orderby 子句可以按升序或降序对结果进行排序。 您还可以指定次要排序顺序。 下面的示例使用 Area 属性对 country 对象执行主要排序, 然后使用 Population 属性执行次要排序。
IEnumerable<Country > querySortedCountries =
from country in countries
orderby country.Area, country.Population descendingselect country;
ascending 关键字是可选的;如果未指定顺序,则它是默认排序顺序。
join 子句使用 join 子句可以根据每个元素中指定键之间的相等比较,对一个数据源中的元素与另外一个数据源中的元素进行关联和/或组合。 在 LINQ 中,联接操作是针对其元素具有不同类型的对象序列执行的。 在联接两个序列之后,必须使用 select 或 group 语句指定要存储到输出序列中的元素。 还可以使用匿名类型将每组关联元素中的属性组合为输出序列的新类型。 下面的示例对其 Category 属性与 categories 字符串数组中的某个类别相匹配的 prod 对象进行关联。 其 Category 不与 categories 中的任何字符串匹配的产品会被筛选掉。 select 语句投影了一个新类型,其属性取自 cat 和 prod。
var categoryQuery =
from cat in categories
join prod in products on cat equals prod.Category
selectnew { Category = cat, Name = prod.Name };
通过使用 into 关键字将 join 操作的结果存储到临时变量中,还可以执行分组联接。
let 子句使用 let 子句可以将表达式(如方法调用)的结果存储到新的范围变量中。 在下面的示例中,范围变量 firstName 存储了 Split 返回的字符串数组的第一个元素。
string[] names = { "Svetlana Omelchenko", "Claire O'Donnell", "Sven Mortensen", "Cesar Garcia" };
IEnumerable<string > queryFirstNames =
from name in names
let firstName = name.Split(newchar[] { ' ' })[0]
select firstName;
foreach (string s in queryFirstNames)
Console.Write(s + " ");
//
OutPut: Svetlana Claire Sven Cesar