class CartesianJoin { static void Main()//使用多个from子句进行交叉连接和合并序列 用户和项目的交叉连接 { var query = from user in SampleData.AllUsers from project in SampleData.AllProjects select new { User = user, Project = project }; //{Project: Skeety Media Player} // //query {System.Linq.Enumerable.SelectManyIterator<Chapter11.Model.User,Chapter11.Model.Project,<>f__AnonymousType4<Chapter11.Model.User,Chapter11.Model.Project>>} foreach (var pair in query) //pair { User = {User: Tim Trotter (Tester)}, Project = {Project: Skeety Media Player} } //{ User = {User: Tim Trotter (Tester)}, Project = {Project: Skeety Talk} } //{ User = {User: Tim Trotter (Tester)}, Project = {Project: Skeety Office} } //{ User = {User: Tara Tutu (Tester)}, Project = {Project: Skeety Media Player} } //{ User = {User: Tara Tutu (Tester)}, Project = {Project: Skeety Talk} } //{ User = {User: Tara Tutu (Tester)}, Project = {Project: Skeety Office} } //{ User = {User: Deborah Denton (Developer)}, Project = {Project: Skeety Media Player} } //{ User = {User: Deborah Denton (Developer)}, Project = {Project: Skeety Talk} } //{ User = {User: Deborah Denton (Developer)}, Project = {Project: Skeety Office} } //{ User = {User: Darren Dahlia (Developer)}, Project = {Project: Skeety Media Player} } //{ User = {User: Darren Dahlia (Developer)}, Project = {Project: Skeety Talk} } //{ User = {User: Darren Dahlia (Developer)}, Project = {Project: Skeety Office} } //{ User = {User: Mary Malcop (Manager)}, Project = {Project: Skeety Media Player} } //{ User = {User: Mary Malcop (Manager)}, Project = {Project: Skeety Talk} } //{ User = {User: Mary Malcop (Manager)}, Project = {Project: Skeety Office} } //{ User = {User: Colin Carton (Customer)}, Project = {Project: Skeety Media Player} } //{ User = {User: Colin Carton (Customer)}, Project = {Project: Skeety Talk} } //{ User = {User: Colin Carton (Customer)}, Project = {Project: Skeety Office} } { Console.WriteLine("{0}/{1}", pair.User.Name, pair.Project.Name); } } }
相等连接--左边序列中的元素和右边序列要进行匹配。交叉连接不在序列之间执行任何匹配操作:
结果包含了所有可能的元素对。它们可以简单地使用两个(或多个)from子句来实现。我们只
考虑两个from子句的情况--涉及多个from子句时,其实可以认为是在前两个from子句上执行交叉
连接,接着把结果序列和下一个from子句再次进行交叉连接,以此类推。每个额外的from子句
都通过透明标识符添加了自己的范围变量。
简单的交叉连接,生成了一个序列,其中每个数据项都由一个用户和一个项目组成。
如果对SQL比较熟悉--它就像指定了多表查询的笛卡儿积。实际上,大多数时候,它正是交叉
连接的用法。然而,你需要的时候,就能发现更强大:在任意特定时刻使用的右边序列依赖于左边
序列的"当前"值。也就是说,左边序列中的每个元素都用来生成右边的一个序列,然后左边这个
元素与右边新生成序列的每个元素都组成一对。这并不是通常意义上的交叉连接,而是将多个
序列高效地合并成一个序列。不管我们是否使用真正的交叉连接,查询表达式的转译是相同的。
输出
Tim Trotter/Skeety Media Player
Tim Trotter/Skeety Talk
Tim Trotter/Skeety Office
Tara Tutu/Skeety Media Player
Tara Tutu/Skeety Talk
Tara Tutu/Skeety Office
Deborah Denton/Skeety Media Player
Deborah Denton/Skeety Talk
Deborah Denton/Skeety Office
Darren Dahlia/Skeety Media Player
Darren Dahlia/Skeety Talk
Darren Dahlia/Skeety Office
Mary Malcop/Skeety Media Player
Mary Malcop/Skeety Talk
Mary Malcop/Skeety Office
Colin Carton/Skeety Media Player
Colin Carton/Skeety Talk
Colin Carton/Skeety Office