LINQ 查询中多个来自选择器的含义是什么



我已经在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;

您将使用INNERLEFT JOIN(EF将根据关系中的多重性映射来决定使用哪一个)。所以类似于:

SELECT d.* FROM Departments AS d
LEFT OUTER JOIN Employees AS e ON d.Id = e.DepartmentId

在这种情况下,使用select没有任何意义(它在语义上不正确,必须使用SelectMany)

相关内容

  • 没有找到相关文章

最新更新