L'application de clauses supplémentaires à une requête compilée entraîne-t-elle une recompilation ?
-
16-09-2020 - |
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 ?
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.