我正在尝试识别和改进 WCF 服务中的一些热点。其中一个查询使用了大量的 Include 语句。SQL server 性能是阳光和棒棒糖,但 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");
有小费吗?