改进从实体框架生成的查询

时间:2011-09-14 15:11:28

标签: c# linq entity-framework

我有一个像这样的查询linq:

var query = from c in Context.Customers select c;
var result = query.ToList();

Linq查询生成此tsql代码:

exec sp_executesql N'SELECT 
[Project1].[Id] AS [Id], 
[Project1].[Name] AS [Name], 
[Project1].[Email] AS [Email]
FROM ( SELECT 
    [Extent1].[Id] AS [Id],
    [Extent1].[Name] AS [Name], 
    [Extent1].[Email] AS [Email]
    FROM [dbo].[Customers] AS [Extent1] ) AS [Project1]

有没有办法不生成子查询?

3 个答案:

答案 0 :(得分:5)

您是否有证据表明该查询导致性能问题?我想查询优化器很容易识别出来。

如果您在分析查询是性能问题后确定(疑点) - 然后 那么 - 您可以简单地将查询转换为存储过程,并称之为。

答案 1 :(得分:2)

你使用像Linq这样的工具,因为你不想编写SQL,在放弃之前你应该至少比较你提出的SQL的查询计划与工具生成的查询计划。我目前无法访问SQL Studio,但如果查询计划不相同,我会有点惊讶......

编辑:有机会查看查询计划,它们实际上是相同的。

答案 2 :(得分:1)

简答:不,你不能修改那个查询。

答案很长:如果你想重新实现Linq提供程序和查询生成器,那么也许有办法,但我怀疑你想这样做。您还可以实现自定义EF provider wrapper,它将从EF传递查询并重新格式化,但这也很难 - 而且速度很慢。你打算为SQL查询编写自定义解释器吗?