EF Preクエリをコンパイルしてスカラー値を返す

私はasp.net 4 c#とef4を使用します。

私はこのコードを持っている、それはクエリをコンパイルし、単一のスカラー値を返す必要があります(私は匿名型を使用します)。

私のコードには明らかにエラーはありませんが、コンパイルされたクエリを書くのは初めてです。パフォーマンスが向上したかどうかはよく書かれているか、改善できるかどうかを知りたいです。

   var query = CompiledQuery.Compile((CmsConnectionStringEntityDataModel ctx)
                        => from o in ctx.CmsOptions
                           where o.OptionId == 7
                           select new
                           {
                               Value = o.Value
                           });

                    uxHtmlHead.Text = query(context).FirstOrDefault().Value;// I print the result in a Label

SQLプロファイル出力:

SELECT TOP (1) 
[Extent1].[OptionId] AS [OptionId], 
[Extent1].[Value] AS [Value]
FROM [dbo].[CmsOptions] AS [Extent1]
WHERE 7 = [Extent1].[OptionId]

どうもありがとう


Wouterのアドバイス後の結果(再度チェックしてください):

        static readonly Func compiledQueryHtmlHead =
    CompiledQuery.Compile(
            (ctx, id) => ctx.CmsOptions.FirstOrDefault(o => o.OptionId == id).Value);


using (var context = new CmsConnectionStringEntityDataModel())
            {
                int id = 7;
                uxHtmlHead.Text = compiledQueryHtmlHead.Invoke(context, id);
            }

結果のSQL(私はLEFT JOINを使用する理由を理解していません)

exec sp_executesql N'SELECT 
[Project1].[Value] AS [Value]
FROM   ( SELECT 1 AS X ) AS [SingleRowTable1]
LEFT OUTER JOIN  (SELECT 
    [Extent1].[Value] AS [Value]
    FROM [dbo].[CmsOptions] AS [Extent1]
    WHERE [Extent1].[OptionId] = @p__linq__0 ) AS [Project1] ON 1 = 1',N'@p__linq__0 int',@p__linq__0=7
0

1 答え

あなたが改善できる2つのことがあります。

まず、問合せをプリコンパイルするのは良い考えですが、コードを見れば、一度だけでなく毎回問合せをプリコンパイルすることがわかります。

プリコンパイルされたクエリを、一度だけ初期化される静的変数に移動する必要があります。

注意する必要があるもう一つのことは、照会をプリコンパイルするときに、実行する前に照会を変更しないことです。

すべての行を選択するプリコンパイル済みの問合せを作成していて、次に「firstordefault」と言ってプリコンパイルされた問合せをSELECT TOP(1)に変更し、プリコンパイルの利点を失います。プリコンパイルされたクエリの中でFirstOrDefaultパーツを移動し、結果を1つだけ返す必要があります。

こちらのドキュメントをご覧ください。サンプルを見ると、静的フィールドを使用してコンパイルされたクエリを保持する方法と、戻り値をどのように指定するかが分かります。

2
追加された
ご協力いただきありがとうございます。
追加された 著者 GibboK,
コードが投稿されました:-)、Wouterはもっと意味をなさないかどうか見てください。私はFuncを使い、メソッドにFirstOrDefaultを含めました。私が理解していない唯一の事は、生成されたSqlのLEFT OUTER JOINです。アイデアはありますか?助けてくれて本当にありがとうございます!
追加された 著者 GibboK,
結果のコードを投稿できますか?他の人にはいいだろう:)
追加された 著者 Wouter de Kort,