加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

entity-framework – SelectMany创建了许多SQL select语句,而不

发布时间:2020-12-12 06:40:44 所属栏目:MsSql教程 来源:网络整理
导读:我正在用SelectMany编写一个查询并检查它在LINQPad中生成的SQL.查询非常简单. 假设我有3个实体:Customer,Order,OrderItem. OrderItem保存有关订购的产品和数量的信息. 我想为一个客户获取所有OrderItems. context.Customers.First().Orders.SelectMany(o=o.O
我正在用SelectMany编写一个查询并检查它在LINQPad中生成的SQL.查询非常简单.

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

我想为一个客户获取所有OrderItems.

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

我得到了我期望的结果集,但SQL对我来说真的很奇怪.有一堆选择语句.首先,它选择一个客户,这是好的.然后它选择一个订单(因为这个客户只有一个),然后在之前选择的订单中为每个OrderItem创建一个选择…所以我得到的选择与所选客户的OrderItems订单一样多.所以它看起来像:

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),然后延迟加载再次加载每个加载订单的订单项集合(查询3到n).要避免所有这些多个查询,您不得在查询表达式中使用First()或ToList()等“查询执行方法”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读