如何让SelectMany使用Join?

Dav*_*vid 5 c# linq-to-sql

鉴于我在Linq To Sql模型中有三个表(Customer,Orders和OrderLines)

客户 - 一对多 - >订单 - 一对多 - > OrderLines

我用的时候

var customer = Customers.First();
var manyWay = from o in customer.CustomerOrders
              from l in o.OrderLines
              select l;
Run Code Online (Sandbox Code Playgroud)

我看到一个查询获得客户,这是有道理的.然后我看到客户订单的查询,然后是每个订单获得订单行的单个查询,而不是加入两个订单.总共n + 1个查询(不包括获取客户)

但是,如果我使用

var tableWay = from o in Orders
               from l in OrderLines
               where o.Customer == customer
               && l.Order == o
               select l;
Run Code Online (Sandbox Code Playgroud)

然后,我没有看到每个订单获得订单行的单个查询,而是看到连接两个表的单个查询.共1个查询(不计入客户)

我更喜欢使用第一个Linq查询,因为它对我来说似乎更具可读性,但为什么L2S不像我在第一个查询中所期望的那样加入表?使用LINQPad我看到第二个查询被编译成SelectMany,虽然我没有看到第一个查询的变化,不确定这是否是我的查询中某些问题的指示.

Fra*_*sco 2

我认为这里的关键是

customer.CustomerOrders
Run Code Online (Sandbox Code Playgroud)

那是一个 EntitySet,而不是一个 IQueryable,因此您的第一个查询不会直接转换为 SQL 查询。相反,它被解释为许多查询,每个查询对应一个订单。

无论如何,这是我的猜测。