Entity framework 额外的连接使SQL Server优化器更难选择正确的执行计划…额外的连接是否使SQL Server优化器更难选择?查询分析器应该能够测量删除两个连接的影响。对于这样一个非常简单的查询,从优化器的角度来看,1个连接和3个连接之间的差异可能很小,但我希望找到这

Entity framework 额外的连接使SQL Server优化器更难选择正确的执行计划…额外的连接是否使SQL Server优化器更难选择?查询分析器应该能够测量删除两个连接的影响。对于这样一个非常简单的查询,从优化器的角度来看,1个连接和3个连接之间的差异可能很小,但我希望找到这,entity-framework,linq-to-entities,Entity Framework,Linq To Entities,额外的连接使SQL Server优化器更难选择正确的执行计划…额外的连接是否使SQL Server优化器更难选择?查询分析器应该能够测量删除两个连接的影响。对于这样一个非常简单的查询,从优化器的角度来看,1个连接和3个连接之间的差异可能很小,但我希望找到这个问题的答案,然后可以应用于更复杂的查询。在一个更真实的场景中,我可能会有需要15个表中数据的查询,我希望有一些“魔术”可以应用到查询中,即使DAL是基于L2E+EF的,也可以将数据保持在15个表中。别误会我的意思。我完全同意你的看法。据我所知


额外的连接使SQL Server优化器更难选择正确的执行计划…额外的连接是否使SQL Server优化器更难选择?查询分析器应该能够测量删除两个连接的影响。对于这样一个非常简单的查询,从优化器的角度来看,1个连接和3个连接之间的差异可能很小,但我希望找到这个问题的答案,然后可以应用于更复杂的查询。在一个更真实的场景中,我可能会有需要15个表中数据的查询,我希望有一些“魔术”可以应用到查询中,即使DAL是基于L2E+EF的,也可以将数据保持在15个表中。别误会我的意思。我完全同意你的看法。据我所知,没有任何标准的方法来解决这个问题。我在MSDN论坛上看到过很多关于这是一个bug的报告,大人物一直说他们在下一个版本中添加了优化。希望在下一个版本中,所有用于做简单事情的XML黑客行为都是不必要的。和任何新技术一样,我们只能等它出来。我认为你是对的,我们只能等着看他们是否会在4.x中修复它。。。不管怎么说,赏金的目的是鼓励人们寻找解决办法,我希望它能产生这样的效果。因为你的回复显示了我在寻找解决办法方面的努力,所以我将选择它作为答案——并且是奖金的赢家。谢谢您的尝试。:)LINQtoSQL生成高效的SQL,这是绝对正确的。查看我对原始线程的响应。然而,Linq到实体是一个不同的故事,这就是为什么我提出了这个挑战,这也是为什么我给它增加了一笔赏金。我很想让L2E表现得像L2S一样,我想找到一些变通办法,让它做到这一点……我不知道你想展示什么。我很犹豫是否要提供一个答案,而这个答案仅仅是用来抨击某人的第一次修订技术。我不想展示任何东西,我想知道是否可以使用L2E/EF v1(.net 3.5)或v2(v4/.net 4.0)要生成SQL查询而不需要所有冗余的额外连接等,我相信一定有办法,但我无法做到这一点。所以为了平息我的好奇心,我悬赏给了一个相对简单的问题一个答案——希望这能鼓励人们找到一种方法来解决这个问题。我选择我做的具体例子的原因是,最初提出问题的人用一个非常简单的查询提供了一个简单的复制。。。如果这个简单的查询可以修复,那么更复杂的查询也可以使用[这个问题的答案是什么]-技术/查询组合来修复。
var list = from o in _entities.orderT.Include("personT")
           .Where(p => p.personT.person_id == person_id && 
                       p.personT.created >= fromTime && 
                       p.personT.created <= toTime).ToList()
           group o by new { o.name, o.personT.created.Year, o.personT.created.Month, o.personT.created.Day } into g
           orderby g.Key.name
           select new { g.Key, count = g.Sum(x => x.price) };
SELECT 
1 AS [C1], 
[Extent1].[order_id] AS [order_id], 
[Extent1].[name] AS [name], 
[Extent1].[created] AS [created], 
[Extent1].[price] AS [price], 
[Extent4].[person_id] AS [person_id], 
[Extent4].[first_name] AS [first_name], 
[Extent4].[last_name] AS [last_name], 
[Extent4].[created] AS [created1]
FROM    [dbo].[orderT] AS [Extent1]
LEFT OUTER JOIN [dbo].[personT] AS [Extent2] ON [Extent1].[person_id] = [Extent2].[person_id]
INNER JOIN [dbo].[personT] AS [Extent3] ON [Extent1].[person_id] = [Extent3].[person_id]
LEFT OUTER JOIN [dbo].[personT] AS [Extent4] ON [Extent1].[person_id] = [Extent4].[person_id]
WHERE ([Extent1].[person_id] = @p__linq__1) AND ([Extent2].[created] >= @p__linq__2) AND ([Extent3].[created] <= @p__linq__3)