防止 Entity Framework 在使用 Include 时添加 ORDER BY

39
我们有一个类似下面的查询:
from x in db.Table.Include(x => x.Parent)
                  .Include(x => x.Parent.Relation)
                  .Include(x => x.Relation)
                  .Include(x => x.Children)
where /* some query */
select x

问题在于当添加 .Include(x => x.Children) 时,Entity Framework 添加到生成的 SQL 中的 ORDER BY 语句导致查询执行时间变长,类似下面的情况:
ORDER BY [Project2].[Id1] ASC, [Project2].[Id2] ASC, [Project2].[Id] ASC, [Project2].[C4] ASC

在linq查询中添加orderby也没有帮助,它不会影响上面的语句,只是添加了一个额外的列进行排序。


3
也许问题应该是:为什么EF要添加ORDER BY?我认为它需要它来将查询结果分成用于创建包含类型的部分。EF可能希望数据库引擎通过索引更有效地进行排序,而不是使用CLR代码。我非常确定没有办法摆脱它。 - Gert Arnold
同 Arnold 达成了一致。你可以尝试在 Children 上创建索引。实际上,按顺序排序不应该减慢查询速度太多... - gilles emmanuel
1
问题在于,即使有手写查询,如果在查询中不指定要按哪一列排序,SQL会假定应该按子表的主键排序,导致查询非常缓慢,并出现警告“Operator used tempdb to spill data during execution with spill level 1”,因为它试图对子表中的所有行进行排序。 - Jamie
如果您在使用ORM时遇到性能问题或担忧,您可能需要考虑使用存储过程。这是您获得性能和优化灵活性的唯一途径。 - Steve
1
我在长期的职业生涯中学到的是,无论项目如何,都不应该使用EF或任何其他疯狂的ORM。考虑使用Dapper重新编写所有内容,它真的很好用。 - Erti-Chris Eelmaa
显示剩余4条评论
1个回答

17

显然,这是EF内部为了方便之后创建结果对象所做的操作。你不能删除order by指令。


11
如果你愿意、有时间和金钱,你可以做任何事情。 - Hamid Pourjam
20
可以,但我假设OP不愿意重新编写实体框架的代码。 - Joanvo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接