2010-11-22 4 views
1

J'ai une question sur un FilterExpression que je prévois d'utiliser sur mon SqlDataSource. Je veux juste savoir si cela fonctionnerait, et ce qui se passerait dans certains scénarios:FilterExpression - cela fonctionnerait-il?

(itemID like '%{0}%' OR parentID like '%{0}%') AND (source like '%{1}%' OR action like '%{1}%' OR itemID like '%{1}%' OR parentID like '%{1}%' OR item like '%{1}%' OR userid like '%{1}%' OR timestamp like '%{1}%') 

{0} paramètre peut être donné dans une chaîne de requête (même si elle peut pas être administré), et {1 } est ce qui est tapé dans une zone de texte. Fondamentalement, l'utilisateur peut accéder à une page qui répertorie tous les enregistrements qui ont un 'itemID' ou 'parentID' comme la chaîne de requête. Ils peuvent ensuite l'affiner encore plus en tapant dans une zone de texte tout texte dont ils aimeraient filtrer toutes les colonnes.

Fondamentalement, cela fonctionnerait-il comme souhaité ci-dessus? Si non, puis-je le changer facilement d'une manière ou d'une autre?

Merci

Répondre

0

Cela fonctionnerait-il? Il semble tellement.

Cependant, cela va être l'enfer sur votre serveur de base de données. En un mot, vous ne serez pas en mesure de tirer parti de l'indexation, des plans de requête mis en cache, ou d'autres conseils d'optimisation. Cela entraînera des analyses de table complètes.

Le serveur de base de données (peu importe lequel) est incapable d'optimiser LIKE '%{some value}%' Le problème est le premier%, ce qui signifie qu'il doit correspondre n'importe où dans la colonne. Bien sûr, toutes les instructions OR rejetteraient les plans de requête de toute façon, alors peut-être que ce n'est pas aussi important que le design entier.

Vous pouvez envisager d'utiliser l'indexation de texte intégral dans ces champs. Une autre idée serait de revenir en arrière et de jeter un coup d'œil sur les exigences pour voir s'il ne serait pas mieux d'implémenter une recherche régulière sur le terrain qui permette de multiples clauses where avec des valeurs distinctes entrées pour les critères.

+0

Merci mon pote, j'en discuterai avec mes collègues demain. – Chris