1

CompiledQuery.Compileを介してコンパイルされたエンティティクエリがあり、別の.Where()句または.OrderBy()句を追加した場合、これらの追加句は完全な再コンパイル、部分的な再コンパイル、または再コンパイルなしを強制しますか?

4

3 に答える 3

2

追加されたすべての句は異なるクエリになり、したがって再コンパイルされます。再コンパイルを行っていないことを確認する場合は、クエリの呼び出しを.AsEnumerable()またはで終了します.ToList()。これによりクエリが具体化され、その後、必要なすべての順序付けなどを実行できます。

ご要望に応じて、このmsdnの記事を参照してください。

于 2010-07-15T22:38:44.167 に答える
1

完全な再コンパイル。

于 2010-07-15T20:27:52.747 に答える
0

コンパイルされたクエリで

public static Func<DataClasses1DataContext, IQueryable<ErrorLog>>
    GetErrorLogs = CompiledQuery.Compile
    ((DataClasses1DataContext context) =>
        context.ErrorLogs.Where(el => el.UserName != "foo"));

このように呼ばれます:

using (DataClasses1DataContext context = new DataClasses1DataContext())
{
    context.Log = Console.Out;
    var res1 = GetErrorLogs(context).ToList();
    var res2 = GetErrorLogs(context).Where(el=>el.ErrorMessage.Contains("foo")).ToList();
}

出力は次のようになります

SELECT [t0].[ErrorLogID], [t0].[ErrorTime], [t0].[UserName], [t0].[ErrorNumber], [t0].[ErrorSeverity], [t0].[ErrorState], [t0].[ErrorProcedure], [t0].[ErrorLine], [t0].[ErrorMessage]
FROM [dbo].[ErrorLog] AS [t0]
WHERE [t0].[UserName] <> @p0
-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [foo]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

SELECT [t0].[ErrorLogID], [t0].[ErrorTime], [t0].[UserName], [t0].[ErrorNumber], [t0].[ErrorSeverity], [t0].[ErrorState], [t0].[ErrorProcedure], [t0].[ErrorLine], [t0].[ErrorMessage]
FROM [dbo].[ErrorLog] AS [t0]
WHERE [t0].[UserName] <> @p0
-- @p0: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [foo]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

唯一の結論は、再コンパイルは行われないということですが.Where(el=>el.ErrorMessage.Contains("foo"))、LINQ2SQLクエリの結果のオブジェクトにLINQ2Objectsが適用されます。

于 2010-09-30T12:30:40.643 に答える