gpt4 book ai didi

entity-framework - SelectMany 创建了许多 SQL 选择语句,而不是一个带有连接的语句

转载 作者:行者123 更新时间:2023-12-04 07:24:42 28 4
gpt4 key购买 nike

我正在用 SelectMany 写一个查询并检查了它在 LINQPad 中生成的 SQL。查询非常简单。

假设我有 3 个实体:Customer , Order , OrderItem . OrderItem保存有关订购的产品和数量的信息。

我要全部OrderItems对于一位客户。

context.Customers.First().Orders.SelectMany(o=>o.OrderItems)

我得到了预期的结果集,但 SQL 对我来说真的很奇怪。有一堆选择语句。首先它选择一个客户,这没问题。然后它选择一个订单(因为这个客户只有一个),然后为每个 OrderItem 创建一个选择。在之前选择的 Order ... 所以我得到的选择与 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 个选择......

最佳答案

您应该使用以下内容进行查询(使用 someId 查询特定客户的订单项目):

context.Customers.Where(c => c.Id == someId)
.SelectMany(c => c.Orders.SelectMany(o => o.OrderItems))

或者 - 重现 First() 的行为但使用单个数据库查询:
context.Customers.Take(1)
.SelectMany(c => c.Orders.SelectMany(o => o.OrderItems))

您的原始查询使用 First 加载客户(查询 1),然后延迟加载加载 Orders该客户的集合(查询 2),然后延迟加载再次加载每个加载的订单项集合 Order (查询 3 到 n)。为避免所有这些多个查询,您不得使用“查询执行方法”,例如 First()ToList()等在您的查询表达式中。

关于entity-framework - SelectMany 创建了许多 SQL 选择语句,而不是一个带有连接的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13721623/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com