2010-05-22 1 views
0

J'ai une requête LINQ qui recherche plusieurs mots-clés sur plusieurs colonnes. L'intention est que l'utilisateur peut rechercher plusieurs mots-clés et il recherchera les mots-clés sur chaque propriété dans mon entité Media. Voici un exemple simplifié:Existe-t-il un moyen d'optimiser cette clause LINQ where qui recherche plusieurs mots-clés sur plusieurs colonnes?

var result = repository.GetAll<Media>().Where(x => 
    x.Title.Contains("Apples") || x.Description.Contains("Apples") || x.Tags.Contains("Apples") || 
    x.Title.Contains("Oranges") || x.Description.Contains("Oranges") || x.Tags.Contains("Oranges") || 
    x.Title.Contains("Pears") || x.Description.Contains("Pears") || x.Tags.Contains("Pears") 
); 

En d'autres termes, je veux rechercher les mots-clés Apples, Oranges et Pears sur les colonnes Title, Description et Tags.

Le SQL ressemble à ceci en sortie:

SELECT * 
FROM Media this_ 
WHERE ((((((((
     this_.Title like '%Apples%' 
    or this_.Description like '%Apples%') 
    or this_.Tags like '%Apples%') 

    or this_.Title like '%Oranges%') 
    or this_.Description like '%Oranges%') 
    or this_.Tags like '%Oranges%') 

    or this_.Title like '%Pears%') 
    or this_.Description like '%Pears%') 
    or this_.Tags like '%Pears%') 

Est-ce le SQL la plus optimale dans ce cas? Sinon, comment réécrire la requête LINQ pour créer l'instruction SQL la plus optimale? J'utilise SQLite pour les tests et SQL Server pour le déploiement réel.

Répondre

2

Le véritable succès des performances est que ce type de requête est difficile à optimiser. Vous voulez trouver des sous-chaînes qui, par défaut, ne sont pas indexables. D'un point de vue purement L2S, vous ne pouvez pas faire grand-chose. Mais si vous pouvez activer la recherche en texte intégral, vous aurez de meilleurs outils à votre disposition pour accélérer votre requête.

See this Stack Overflow post for more info.

+0

Merci pour votre réponse. J'ai effectué un test comme Jon Skeet mentionné et il s'avère que le temps d'exécution pour mon nombre d'enregistrements attendus est négligeable. –

0

Je ne vois pas comment cela pourrait être beaucoup plus rapide, pour être honnête. Certes, un style "contient" de caractères génériques est susceptible d'être assez lent pour commencer (par rapport à "commence avec" par exemple).

Avez-vous examiné le plan d'exécution de SQL Server? Quelle est la performance réelle, avec un jeu de données réaliste?

+0

Je viens de créer 2000 enregistrements dans une base de données SQLite et a dirigé une requête un peu comme celui que je posté. Selon NHProf, il n'a fallu que 43 ms pour l'ensemble de la requête. De manière réaliste, le client ne disposera que de plusieurs milliers d'enregistrements (et non de millions), de sorte que la performance est parfaitement satisfaisante. –

+0

@Daniel T: Vous devriez également essayer SQL Server - bien qu'avec seulement des milliers d'enregistrements, je ne m'attendrais pas à un problème. –

Questions connexes