JOIN子句:
使用 join 子句可以将来自不同源序列并且在对象模型中没有直接关系的元素相关联。 唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值。
三种类型的链接:
左外部联接:在其中返回第一个集合的每个元素,而无论该元素在第二个集合中是否具有相关元素。 可以使用 LINQ,通过对分组联接的结果调用 DefaultIfEmpty 来执行左外部联接。 通过调用调用 DefaultIfEmpty 方法来执行左外部联接。 执行做外部链接需要做好对null的处理和判断。
var temLefJoin = from person in people
join pet in pets
on person equals pet.Owner into hj
from tempSub in hj.DefaultIfEmpty()
select new {PersoName=person.FirstName+person.LastName, petName=(tempSub==null?string.Empty:tempSub.Name) };
多联接:可以将任意数量的联接操作拼接在一起以执行多联接
var tempList = from cat in cats
join dog in dogs
on cat.Owner
equals dog.Owner
join person in people
on cat.Owner equals person
select new { PesonName = person.FirstName + person.LastName, CatName = cat.Name, dogName= dog.Name };
复核键联接:
//// 判断那些人即使学生又是雇员
var tempPersons = from employee in employees
join student in students
on new { employee.FirstName, employee.LastName }
equals new { student.FirstName, student.LastName }
select new { Name = student.FirstName + " " + student.LastName };
let 子句:
在查询表达式中,存储子表达式的结果有时很有用,这样可以在随后的子句中使用。 可以使用 let 关键字完成这一工作,该关键字可以创建一个新的范围变量,并且用您提供的表达式的结果初始化该变量。 一旦用值初始化了该范围变量,它就不能用于存储其他值。 但如果该范围变量存储的是可查询的类型,则可以对其进行查询。
var earlyBirdQuery =
from sentence in strings
let words = sentence.Split(' ')
from word in words
let w = word.ToLower()
where w[0] == 'a' || w[0] == 'e'
|| w[0] == 'i' || w[0] == 'o'
|| w[0] == 'u'
select word;