我正在尝试识别和改进WCF服务中的一些热点。其中一个查询使用了大量的Include语句。 SQL服务器性能是阳光和棒棒糖,但EF性能非常糟糕。
将这个怪物分解成几个较小的查询已经帮助了很多,将一些查询转换为CompiledQueries也为整个执行时间创造了奇迹。
可悲的是,EF似乎缺乏在CompiledQuery中正确处理Include语句的可能性,抛出异常说:
LINQ to Entities does not recognize the method 'System.Linq.IQueryable`1[xx] Include[xxx](System.Linq.IQueryable`1[xxx], System.String)' method, and this method cannot be translated into a store expression.
编译后的查询看起来像这样:
private static readonly Func<OurContext, Guid, IQueryable<MyType>> GetResidenceAccessForSubscriber =
CompiledQuery.Compile<OurContext, Guid, IQueryable<MyType>>(
(context, value) => (
from t in context.MyType.Include("Stuff.MoarStuff")
where t.Id == value
select t));
虽然原件看起来像(并且有效):
var q = (
from tin container.MyType
where t.Id == id
select t)
.Include("Stuff.MoarStuff");
任何提示?