以下(缩减)代码摘录是Linq-To-Entities查询,该查询导致SQL(通过ToTraceString)比手工制作的查询慢 。我做了什么愚蠢的事,或者Linq-to-Entities在优化查询方面做得不好?
我在查询结尾处有一个ToList(),因为我需要在使用它来构建XML数据结构之前执行它(这是另一个痛苦)。
var result = (from mainEntity in entities.Main
where (mainEntity.Date >= today) && (mainEntity.Date <= tomorrow) && (!mainEntity.IsEnabled)
select new
{
Id = mainEntity.Id,
Sub =
from subEntity in mainEntity.Sub
select
{
Id = subEntity.Id,
FirstResults =
from firstResultEntity in subEntity.FirstResult
select new
{
Value = firstResultEntity.Value,
},
SecondResults =
from secondResultEntity in subEntity.SecondResult
select
{
Value = secondResultEntity.Value,
},
SubSub =
from subSubEntity in entities.SubSub
where (subEntity.Id == subSubEntity.MainId) && (subEntity.Id == subSubEntity.SubId)
select
new
{
Name = (from name in entities.Name
where subSubEntity.NameId == name.Id
select name.Name).FirstOrDefault()
}
}
}).ToList();
在研究这个问题的同时,我也有一些与日期有关的问题。当我试图在我的数据结构中包含返回的日期时,我得到了内部错误“1005”。
答案 0 :(得分:7)
正如一般观察而不是基于Linq-To-Entities的任何实际经验(尚未):在单个查询中包含四个嵌套子查询看起来并不像开始时非常有效和快速。
我认为你对Linq-to-Entities生成的SQL(缺乏)质量的非常广泛的陈述是不合理的 - 而且你也没有用很多证据支持它。
一些备受尊敬的人,包括Rico Mariani(MS Performance guru)和Julie Lerman(编程EF的作者)已经在各种测试中展示了一般和整体,Linq-to-SQL而Linq-to-Entities的“引擎”实际上并不是那么糟糕 - 它们总体上至少达到了可能的峰值性能的80-95%。并非每个.NET应用程序开发都可以实现: - )
有没有办法让你重写那个查询或改变你检索构成其内容的点点滴滴的方式?
马克
答案 1 :(得分:0)
您是否尝试过通过调用.ToList()立即实现结果?我不确定它会有所作为,但是如果你遍历结果而不是调用.ToList()......你可能会看到改进的性能。
foreach( var r in result )
{
// build your XML
}
此外,您可以尝试将一个巨大的查询分解为单独的查询,然后迭代结果。把一切都塞进一大堆可能是个问题。