LINQjoin多个从句子

在C#中编写LINQ查询时,我知道可以使用join关键字执行join 。 但是下面是做什么的?

 from c in Companies from e in c.Employees select e; 

LINQ的书我说这是一种连接,但不是一个正确的连接(使用join关键字)。 那究竟是什么types的连接呢?

多个“from”语句被认为是复合LINQ语句。 它们就像嵌套的foreach语句。 msdn页面在这里列出了一个很好的例子

  var scoreQuery = from student in students from score in student.Scores where score > 90 select new { Last = student.LastName, score }; 

这句话可以改写为:

 SomeDupCollection<string, decimal> nameScore = new SomeDupCollection<string, float>(); foreach(Student curStudent in students) { foreach(Score curScore in curStudent.scores) { if (curScore > 90) { nameScore.Add(curStudent.LastName, curScore); } } } 

这将被转换为SelectMany()调用。 它本质上是一个交叉连接。

作为Edulinq系列的一部分,Jon Skeet在他的博客上进行了谈论 。 ( 从“子句”向下滚动到“ 次要” 。)

您列出的代码:

 from c in company from e in c.Employees select e; 

…将为companyvariables中的每个公司生成每个员工的列表。 如果员工为两家公司工作,他们将被列入清单两次。

这里可能发生的唯一的“join”是当你说c.Employees 。 在SQL支持的提供程序中,这将转换为从Company表到Employee表的内部联接。

但是,double- from结构通常用于手动执行“连接”,如下所示:

 from c in companies from e in employees where c.CompanyId == e.CompanyId select e; 

这与您发布的代码具有相似的效果,根据employeesvariables包含的内容可能会有细微的差异。 这也相当于下面的join

 from c in companies join e in employees on c.CompanyId equals e.CompanyId select e; 

如果你想要一个笛卡尔产品,但是,你可以删除where子句。 (为了使它值得一提,你可能也想稍微改变一下select 。)

 from c in companies from e in employees select new {c, e}; 

这最后一个查询会给你公司和员工的每一个可能的组合。

所有第一组对象将与所有第二组对象连接。 例如,下面的testing将通过…

  [TestMethod()] public void TestJoin() { var list1 = new List<Object1>(); var list2 = new List<Object2>(); list1.Add(new Object1 { Prop1 = 1, Prop2 = "2" }); list1.Add(new Object1 { Prop1 = 4, Prop2 = "2av" }); list1.Add(new Object1 { Prop1 = 5, Prop2 = "2gks" }); list2.Add(new Object2 { Prop1 = 3, Prop2 = "wq" }); list2.Add(new Object2 { Prop1 = 9, Prop2 = "sdf" }); var list = (from l1 in list1 from l2 in list2 select l1).ToList(); Assert.AreEqual(6, list.Count); }