C# 为什么LINQ生成的SQL对实体如此低效?

C# 为什么LINQ生成的SQL对实体如此低效?,c#,linq-to-entities,C#,Linq To Entities,下面的精简代码摘录是一个Linq到实体查询,它通过ToTraceString生成SQL,比手工创建的查询慢得多。我是在做什么蠢事,还是LINQtoEntities不擅长优化查询 我在查询的末尾有一个ToList,因为我需要在使用它构建XML数据结构之前执行它,这是另一个难题 var result = (from mainEntity in entities.Main where (mainEntity.Date >= today) && (mai

下面的精简代码摘录是一个Linq到实体查询,它通过ToTraceString生成SQL,比手工创建的查询慢得多。我是在做什么蠢事,还是LINQtoEntities不擅长优化查询

我在查询的末尾有一个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。

这只是一个一般性的观察,而不是基于Linq to实体的任何实际经验:在一个查询中包含四个嵌套的子查询一开始看起来并不是非常高效和快速

我认为您关于LINQtoEntities生成的SQL缺乏质量的非常宽泛的陈述是不合理的,而且您也没有通过太多的证据来支持它

包括MS Performance guru和Programming EF的作者在内的几位受人尊敬的人士已经在各种测试中证明,总体而言,Linq-to-SQL和Linq-to-Entities引擎并没有那么糟糕——它们至少实现了80-95%的可能峰值性能。并非每个.NET应用程序开发人员都能实现这一点:-

您有没有办法重写该查询或更改检索构成其内容的位和块的方式


Marc

您是否尝试过不立即通过调用.ToList来实现结果?我不确定这会有什么不同,但是如果您迭代结果而不是调用.ToList,您可能会看到性能的提高

foreach( var r in result )
{
  // build your XML
}
此外,您可以尝试将一个巨大的查询分解为单独的查询,然后对结果进行迭代。将所有内容一次性发送可能是个问题。

LINQ中不建议将嵌套子查询用于实体(例如,而不是联接)吗?看见