约瑟夫·阿尔巴哈里和本·阿尔巴哈里(奥莱利)在果壳中的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
是隐式定义类型TInput
和SomeType
之间的关系,从而表示连接?我是对的吗?
答案 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%确定该提供程序是否会生成INNER
或LEFT
联接,但关键是JOIN操作是由Select
方法产生的。