为什么LINQ-to-Entities生成的SQL效率低下?

0 c# linq-to-entities

以下(削减)代码摘录是LINQ到实体的查询导致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();
Run Code Online (Sandbox Code Playgroud)

在研究这个问题的同时,我也有一些与日期有关的问题.当我试图在我的数据结构中包含返回的日期时,我得到了内部错误"1005".

mar*_*c_s 7

正如一般观察而不是基于Linq-To-Entities的任何实际经验(尚未):在单个查询中有四个嵌套子查询看起来并不像开始时非常有效和快速.

我认为你对Linq-to-Entities生成的SQL(缺乏)质量的非常广泛的陈述是不合理的 - 而且你也没有用很多证据支持它.

一些备受尊敬的人,包括波多黎各马里亚尼(MS性能专家)和朱莉·勒曼("编程EF"的作者)已经呈现在各种测试中,总体和总体来看,LINQ到SQL和LINQ到实体"引擎"并非真的那么糟糕 - 它们总体上达到了可能的最高性能的至少80-95%.不是每个.NET应用程序开发都可以实现这一点:-)

有没有办法让你重写那个查询或改变你检索组成其内容的点点滴滴的方式?