【发布时间】:2017-08-04 11:33:24
【问题描述】:
我有一个大型 LINQ 查询,导致 SQL 查询效率低下。我很确定我可以通过调整查询对其进行很多优化(就像 Scott Gu 在 this blog post 中提到的,以及 Eugene Prystupa 在 this excellent blog post 中提到的那样,他称之为“提示”)。
但是,此查询是重要的遗留代码,因此我宁愿不触及查询本身。是否可以通过修改生成的 IQueryable 来塑造 LINQ 查询?
例如,假设低效查询在GetOrders 中,它以IQueryable<Order> 形式返回查询结果。我可以塑造 IQueryable 结果吗?例如:
var result = GetOrders();
result = result.Select(o =>
new { o, o.Id, o.Customer, o.Payment })
.AsEnumerable()
.Select(o => o.o);
注意最后的Select,即取回Order对象。 (有关此 gem,请参阅 Prystupa's blog。)此示例塑造的重点是让 LINQ2SQL(或实体框架)将 Order 表与 Customer 和 Payment 连接起来。原始查询将在查询 Order 后查询这些表 n 次,其中 n 是 Orders 的数量。
【问题讨论】:
-
能否先提供
GetOrders()函数,因为我认为它不会返回 IQuerable? -
为什么不呢?它返回表上
Where的结果。即,return Db.Orders.Where(o => …等。 -
GetOrders的返回类型是IQueryable还是IEnumerable? -
IQueryable
。为什么你认为不是? -
@Protectorone:如果该方法返回 IQueryable,则还没有转换为 sql。然后,您几乎可以做任何您想做的事情。但是你的问题有点奇怪,你只问“有没有可能……”,答案是“是的”。那么你真正期待什么样的建议呢?
标签: c# sql .net linq linq-to-sql