在C#中编写LINQ查询时,我知道我可以使用join
关键字执行连接。但是以下是做什么的?
from c in Companies
from e in c.Employees
select e;
LINQ书我说它是一种连接,但不是正确的连接(使用join
关键字)。那么究竟是什么类型的连接呢?
答案 0 :(得分:43)
多个“from”语句被视为复合linq语句。它们就像嵌套的foreach语句。 msdn页面列出了一个很好的例子here
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);
}
}
}
答案 1 :(得分:26)
这将转换为SelectMany()
电话。它本质上是一个交叉连接。
答案 2 :(得分:19)
您列出的代码:
from c in company
from e in c.Employees
select e;
...将为company
变量中的每个公司生成每个员工的列表。如果一名员工为两家公司工作,他们将被列入清单两次。
此处可能出现的唯一“加入”是当您说c.Employees
时。在SQL支持的提供程序中,这将转换为从Company
表到Employee
表的内部联接。
但是,双from
构造通常用于手动执行“连接”,如下所示:
from c in companies
from e in employees
where c.CompanyId == e.CompanyId
select e;
这与您发布的代码具有类似的效果,可能会有细微的差别,具体取决于employees
变量包含的内容。这也等同于以下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};
最后一个查询将为您提供公司和员工的所有可能组合。
答案 3 :(得分:-1)
所有第一组对象将与所有第二组对象连接。例如,以下测试将通过......
[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);
}