我正在编写一个查询SelectMany
并检查它在 LINQPad 中生成的 SQL。查询非常简单。
假设我有 3 个实体:Customer
, Order
, OrderItem
. OrderItem
保存有关订购什么产品和数量的信息。
我想OrderItems
为一个客户得到所有。
context.Customers.First().Orders.SelectMany(o=>o.OrderItems)
我得到了我期望的结果集,但 SQL 对我来说真的很奇怪。有一堆选择语句。首先它选择一个客户,这没关系。然后它选择一个订单(因为这个客户只有一个),然后为OrderItem
之前选择的每个订单创建一个选择Order
......所以我得到的选择数量与 selected的OrderItems
+一样多。所以它看起来像:Orders
Customer
select top 1 from Customers;
select * from Orders where CustomerID = @cID;
select * from OrderItems where OrderID = @o1;
select * from OrderItems where OrderID = @o2;
select * from OrderItems where OrderID = @o3;
select * from OrderItems where OrderID = @o4;
我期望的是这样的:
select oi.*
from OrderItems oi
join Orders o on o.OrderID = oi.OrderId
join Customers c on c.CustomerID = o.CustomerID
where c.CustomerID = @someID
一个选择,漂亮干净。
SelectMany
真的像那样工作还是我做错了什么,或者我的模型有问题?我找不到任何关于这种简单SelectMany
应该如何转换为 SQL 的示例。
这对于小数字无关紧要,但是当客户有 100 个订单,每个订单有 200 个订单项目时,就会有 20 000 个选择......