Si j'ai une requête d'entités compilée via CompiledQuery.Compile et que je clique sur une autre clause .Where() ou .OrderBy(), ces clauses d'addition forcent-elles une recompilation complète, une recompilation partielle ou aucune recompilation?L'application de clauses supplémentaires à une requête compilée provoque-t-elle une recompilation?
L'application de clauses supplémentaires à une requête compilée provoque-t-elle une recompilation?
Répondre
Avec la requête
public static Func<DataClasses1DataContext, IQueryable<ErrorLog>>
GetErrorLogs = CompiledQuery.Compile
((DataClasses1DataContext context) =>
context.ErrorLogs.Where(el => el.UserName != "foo"));
appelé comme ceci compilé:
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 ce
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 recompilation, mais le .Where(el=>el.ErrorMessage.Contains("foo"))
est appliqué avec LINQ2Objects sur les objets résultant de la requête LINQ2SQL .
Une recompilation complète.
Avez-vous une source? –
Oui, mais si vous ne faites pas vraiment confiance à la réponse que vous obtenez ici, pourquoi demander? Je peux comprendre un certain degré de scepticisme, mais la réponse est si facile à trouver que l'utilisateur cynique pourrait tout aussi bien le trouver. Je réponds aux questions ici en tant que développeur expérimenté, pas en tant que bibliothécaire personnel. –
Malheureusement, avec cette catégorie de questions, il est difficile de déterminer si votre réponse est correcte sans l'approvisionnement. Personnellement, j'ai passé plusieurs heures à chercher la réponse sur Google, mais peut-être mon Google-fu est beaucoup plus faible que le vôtre. Mais si quelqu'un d'autre venait et disait une autre réponse, sans sourcing, comment pourrais-je déterminer le bon? Pour moi, ce type de question repose sur des personnes qui ont trouvé la réponse correcte en fournissant une réponse sous la forme d'un programme vérifiable ou d'une réponse fournie. Si cela vous offense, je m'excuse. –
Toutes les clauses ajoutées résultent en une requête différente, et donc une recompilation. Si vous voulez être sûr que vous ne faites pas de recompilation, terminez l'appel à la requête avec un .AsEnumerable()
ou .ToList()
. Cela matérialise la requête, et après cela, vous pouvez faire toutes les commandes, etc. En fonction de votre demande, voir this msdn article.
Je ne sais pas comment vous avez fait vos tests, mais l'ajout d'un où après une requête compilée entraîne certainement une recompilation. – Carvellis