深入理解 c# 第十一章 用户和项目的交叉连接 使用多个from子句进行交叉连接和合并序列

 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


猜你喜欢

转载自blog.csdn.net/eyetired/article/details/80233555