L'application de clauses supplémentaires à une requête compilée entraîne-t-elle une recompilation ?

StackOverflow https://stackoverflow.com/questions/3259580

Question

Si j'ai une requête d'entités compilées via CompiledQuery.Compile et que j'ajoute ensuite une autre clause .Where() ou .OrderBy(), ces clauses d'ajout forcent-elles une recompilation complète, une recompilation partielle ou aucune recompilation ?

Était-ce utile?

La solution

Avec la requête compilée

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

appelé comme ceci :

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();
}

la sortie est comme ça

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

La seule conclusion est qu'il n'y a pas de recompilation, mais le .Where(el=>el.ErrorMessage.Contains("foo")) est appliqué avec LINQ2Objects sur les objets issus de la requête LINQ2SQL.

Autres conseils

Toutes les clauses ajoutées entraînent une requête différente, et donc une recompilation.Si vous voulez être sûr de ne pas recompiler, terminez l'appel à la requête avec un .AsEnumerable() ou .ToList().Cela matérialise la requête, et après cela vous pouvez effectuer toute la commande, etc.tu veux.

Selon votre demande, voir cet article msdn.

Un recompilement complet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top