Linq Select和SelectMany正在执行连接

时间:2016-08-09 09:21:34

标签: c# linq

  约瑟夫·阿尔巴哈里和本·阿尔巴哈里(奥莱利)在果壳中的C#6.0。

     

版权所有2016 Joseph Albahari和Ben Albahari,978-1-491-92706-9。

在第9章中介绍了Linq运算符。对于每个操作,例如过滤,投影,连接等,它列出了System.Linq中可用的扩展方法,以执行相关操作。

在第394页,它涉及投射:

  

投放(输入:IEnumerable<TSource>→输出:IEnumerable<TResult>

     

使用lambda函数转换每个元素。 SelectMany变平   嵌套序列; Select SelectMany执行内部联接,左侧   LINJ to SQL和EF的外连接,交叉连接和非equi连接:

     

Linq API :选择,SelectMany

直观地说,更容易看出SelectMany如何等同于加入关系数据库,但仅仅Select呢?我不确定我是如何单独选择可以进行任何类型的加入。

唯一可能是Select执行与联接等效的事情的唯一情况是

IEnumerable<TInput> input = ...

input.Select(new [SomeType] { a = input.a + c, b = input.a + d }; 

然后可以说这个Projection是隐式定义类型TInputSomeType之间的关系,从而表示连接?我是对的吗?

1 个答案:

答案 0 :(得分:3)

一个简单的例子:

context.Students.where(x=> x.StudentID == 1).Select(x=> x.Department).FirstOrDefault();

是Equivelant:

SELECT TOP 1 D.* FROM Student S 
INNER JOIN Department D
ON S.DepartmentID = D.DepartmentID
WHERE S.StudentID = 1

基本上将Select与导航属性结合使用可能会在某个时刻产生JOIN。在上面的Linq查询中,您选择的是具有ID == 1的学生的部门。

我不是100%确定该提供程序是否会生成INNERLEFT联接,但关键是JOIN操作是由Select方法产生的。