我知道通过在LINQ-to-SQL或LINQ-to-Entities查询中投射(或"整形")结果,可以将生成的SQL查询推送到比没有更高性能的情况下
这里有两篇优秀的文章by Eugene Prystupa,by Rick Strahl。
请注意,在这些文章中给出的示例中,投影仅包括与起点具有1对1关系的子项。例如,Order.Customer
,Order.Date
等。当我包含具有1对M关系的实体时,例如Order.OrderItems
,我最终生成了多个SQL查询:一个在表Order
上,一个n
个查询在表OrderItem
上,其中n
是数字从第一个查询返回的Orders
。 (我说"至少",因为如果OrderItem
也有子实体,这些将获得他们自己的SQL选择查询。)
导致单个SQL查询的示例代码:
Orders.Select(o => new {
o.Id,
o.Customer.FirstName,
o.EmployeeName
}).Take(3)
导致(至少)n
SQL查询的示例代码:
Orders.Select(o => new {
o.Id,
o.Customer.FirstName,
o.EmployeeName,
o.OrderItems
}).Take(3)
是否总是在使用1对M关系的子项形成数据时始终生成多个SQL查询?或者可以重写LINQ查询,以便结果是单个(更高性能)SQL查询?
(请注意,我目前正在使用LINQ-to-SQL,但我也想知道LINQ-to-Entities。)