2009-06-19 9 views
0

J'ai des problèmes de performance avec Linq2Sql par rapport à ADO.NET brut qui m'a conduit dans le chemin des requêtes compilées. J'ai jusqu'ici jusqu'à présentComment écrire des requêtes compilées Linq2Sql dynamiques?

public static readonly Func<MyDataContext, WebServices.Search.Parameters, IQueryable<image>> 
    Compiled_SelectImagesLinq = 
     CompiledQuery.Compile<MyDataContext, WebServices.Search.Parameters, IQueryable<image>>(
      (dc, parameters) => from i in dc.images 
        join l in dc.links on i.image_id equals l.image_id 
        join r in dc.resolutions on i.image_id equals r.image_id 
        where i.image_enabled == true && i.image_rating >= parameters.MinRating 
        && i.image_rating <= parameters.MaxRating 
        select i 
    ); 

Cependant, je ne peux pas comprendre comment ajouter les paramètres supplémentaires en option à la requête que je fais actuellement

if (parameters.Country != null) 
{ 
    query = query.Where(x => x.image_country_id == parameters.Country); 
} 

if (parameters.ComponentId != null) 
{ 
    query = query.Where(x => x.links.Any(l => l.link_component_id == parameters.ComponentId)); 
} 

etc, etc

I essayé d'écrire une autre fonction qui fait

var query = Compiled_SelectImagesLinq(parameters); 

puis en ajoutant les paramètres supplémentaires à la requête et le retour

return query.Distinct().Take(parameters.Results); 

Bit cela ne semble pas juste et renvoie aucun résultat

Répondre

0

Il faudrait comparer votre requête, mais souvent des requêtes doit être utilisé 10-20 fois avant compilé l'amélioration des performances de requête égalent les frais généraux. Aussi, comment ajoutez-vous des paramètres à la clause where?

De plus, les requêtes dynamiques compilées semblent être un peu incompatibles. La bibliothèque de requêtes Dynamic LINQ fera ce dont vous avez besoin, mais je ne pense pas que vous obtiendrez l'amélioration des performances de la requête compilée que vous voulez.

+2

La requête sera exécutée 1000 fois par jour. Les paramètres sont générés à la suite d'un appel à un service Web à partir de pages Web afin de récupérer des images pertinentes à partir d'un stockage en nuage basé sur plusieurs critères. J'espère que cela a du sens. Je commence à penser que j'essaye de forcer le problème de Linq et je devrais juste utiliser Raw ADO pour la performance et la recherche d'index de texte libre plus simple –

+0

Mais combien de fois sera-t-il recompilé par jour? Allez-vous tenir la requête compilée en mémoire quelque part? En outre, chaque requête dynamique sera exécutée des milliers de fois par jour? En outre, je suis curieux de savoir comment les performances des requêtes peuvent faire la différence lorsque vous devez télécharger des images (le temps de transfert n'est-il pas beaucoup plus long que l'heure de la requête?). Je n'essaie pas de critiquer votre design, je suis juste intrigué par l'idée d'une situation qui nécessite ces caractéristiques. – marr75

Questions connexes