WCF サービスのいくつかのホットスポットを特定して改善しようとしています。クエリの 1 つは、非常に多くの 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");
任意のヒント?