Вызывает ли применение дополнительных предложений к скомпилированному запросу перекомпиляцию? - PullRequest
1 голос
/ 16 июля 2010

Если у меня есть запрос скомпилированных сущностей через CompiledQuery.Compile, и я затем добавляю другое предложение .Where () или .OrderBy (), принудительно ли эти дополнительные предложения выполняют полную, частичную или не перекомпилировать?

Ответы [ 3 ]

2 голосов
/ 16 июля 2010

Все добавленные предложения приводят к другому запросу и, следовательно, к перекомпиляции.Если вы хотите быть уверены, что не выполняете перекомпиляцию, завершите вызов запроса с помощью .AsEnumerable() или .ToList().Это материализует запрос, и после этого вы можете выполнить все необходимые операции и т. Д.

По вашему запросу см. эту статью MSDN .

1 голос
/ 16 июля 2010

Полная перекомпиляция.

0 голосов
/ 30 сентября 2010

С скомпилированным запросом

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")) применяется с объектами LINQ2Object к объектам, полученным в результате запроса LINQ2SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...