【发布时间】:2012-04-12 01:35:45
【问题描述】:
我的查询表现不佳,例如生成的 SQL 代码是次优的。
原始语句看起来像这样(简化):
ctx.Table1.Where(t => ...)
.OrderBy(t => ....)
.Select(t => new {Table1 = t,
SomeProperty = t.Table2.SomeProperty,
SomeProperty2 = t.Table2.SomeProperty2,
AnotherProperty = t.Table3.AnotherProperty,
...
}
我查看了 SQL Profiler,发现生成的 SQL 会多次加入同一个表,执行语句大约需要 1 秒。
然后我将语句重写为以下内容:
from t in ctx.Table1
join t2 in ctx.Table2 on t.key equals t2.key into lt2
from t2 in lt2.DefaultIfEmpty()
join t3 in ctx.Table3 on t.key equals t3.key into lt3
from t3 in lt3.DefaultIfEmpty()
where t ...
orderby t...
select new {Table1 = t, .... }
这生成了一个更好的语句,当从 SQL 分析器中获取并在 Management Studio 中执行时,它的速度是上一个示例中代码生成的语句的两倍。
但是,在运行第二个示例中的代码时,EF 生成表达式所用的时间远远超过了从查询优化中获得的时间。
那么我该如何将第二个声明写成CompiledQuery。我基本上不知道如何从CompiledQuery 返回匿名类型。
【问题讨论】:
标签: c# entity-framework entity-framework-4 linq-to-entities