entity-framework – SelectMany创建了许多SQL select语句,而不
我正在用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()等“查询执行方法”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- SQLServer2005 XML在T-SQL查询中的典型应用
- DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC SH
- SQLServer恢复表级数据详解
- 数据库 – 删除旧域信任. Now Progress(9.1D)无法打开DB Fi
- SQLServer 数据类型int、bigint、smallint 和 tinyint范围
- ADO.net的SqlConnection问题
- SQLserver2008联机文档 安装及下载
- 用批处理实现自动备份和清理mysql数据库的代码
- sql – 如何在一个表中返回所有列,另一个使用join返回一个?
- sql-order-by – 如何在Play中使用ORDERBY和findAll()