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;
…将为company
variables中的每个公司生成每个员工的列表。 如果员工为两家公司工作,他们将被列入清单两次。
这里可能发生的唯一的“join”是当你说c.Employees
。 在SQL支持的提供程序中,这将转换为从Company
表到Employee
表的内部联接。
但是,double- from
结构通常用于手动执行“连接”,如下所示:
from c in companies from e in employees where c.CompanyId == e.CompanyId select e;
这与您发布的代码具有相似的效果,根据employees
variables包含的内容可能会有细微的差异。 这也相当于下面的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); }