我已经在LINQ查询中多次看到多个from子句,但还没有弄清楚它与TSQL语句的对应关系。
var r = from p in products
from d in departments
from c in something
select p;
那有什么用
这是否转换为SELECT * FROM products, departments, something
的SQL?
此外,在这种情况下,select
应该始终是SelectMany
。我如何知道select
何时实际上是SelectMany
这将在概念上转换为如下代码:
var r = products.SelectMany(p => departments, (p, d) = new { p, d })
.SelectMany(z => something, (z, c) => new { z, c })
.Select(zz => zz.z.p);
基本上第一个CCD_ 6之后的每个CCD_。实际上,在这种情况下,编译器会注意到,在最后一个from
子句之后只有一个select
,它将实际上转换为:
var r = products.SelectMany(p => departments, (p, d) = new { p, d })
.SelectMany(z => something, (z, c) => z.p);
但我倾向于首先想到"逻辑"形式。
注意,在这种情况下,您没有在from
子句中使用早期的范围变量,但您可以:
var query = from person in people
from friend in person.Friends
select person.Name + " is friends with " + friend.Name;
这与TSQL语句有何对应?
这取决于您使用from
子句的方式。如果您使用:
var query = from d in context.Departments
from e in context.Employees
select d;
您的查询将是CROSS JOIN
,因为所使用的产品和部门之间没有关系。所以类似于:
SELECT d.* FROM Departments AS d
CROSS JOIN Employees AS e
显然,您应该避免交叉连接。如果您在第二个from
:中使用导航属性
var query = from d in context.Departments
from e in d.Employees
select d;
您将使用INNER
或LEFT JOIN
(EF将根据关系中的多重性映射来决定使用哪一个)。所以类似于:
SELECT d.* FROM Departments AS d
LEFT OUTER JOIN Employees AS e ON d.Id = e.DepartmentId
在这种情况下,使用select没有任何意义(它在语义上不正确,必须使用SelectMany)