Disons que vous avez votre id de catégorie dans un tableau d'entiers et le Nom est une chaîne de caractères. L'astuce est de créer le texte de commande pour vous permettre d'entrer votre id de catégorie comme paramètres individuels et la construction de la correspondance floue pour le nom. Pour la première, nous utilisons une boucle pour construire une séquence de noms de paramètre @p0 via @pN-1 où N est le numéro d'id de catégorie dans le tableau. Puis nous construisons un paramètre et l'ajouter à la commande avec la catégorie associée id, comme la valeur de chaque paramètre nommé. Ensuite, nous utilisons la concaténation du nom dans la requête elle-même pour permettre la recherche floue sur le nom.
string Name = "someone";
int[] categoryIDs = new int[] { 238, 1138, 1615, 1616, 1617,
1618, 1619, 1620, 1951, 1952,
1953, 1954, 1955, 1972, 2022 };
SqlCommand comm = conn.CreateCommand();
string[] parameters = new string[categoryIDs.Length];
for(int i=0;i<categoryIDs.Length;i++)
{
parameters[i] = "@p"+i;
comm.Parameters.AddWithValue(parameters[i], categoryIDs[i]);
}
comm.Parameters.AddWithValue("@name",Name);
comm.CommandText = "SELECT * FROM Products WHERE Category_ID IN (";
comm.CommandText += string.Join(",", parameters) + ")";
comm.CommandText += " OR name LIKE '%' + @name + '%'";
C'est entièrement paramétrable requête qui devrait faire votre DBA heureux. Je soupçonne que, puisque ce sont des nombres entiers, mais il ne serait pas beaucoup d'un risque de sécurité juste pour construire le texte de la commande directement avec les valeurs, tout en continuant de le paramétrage du nom. Si votre id de catégorie sont dans un tableau de chaîne, juste diviser le tableau sur les virgules, convertir chaque nombre entier, et de le stocker dans le tableau entier.
Note: je dis de tableau et de l'utiliser dans l'exemple, mais il devrait fonctionner pour n'importe quelle collection, bien que votre version sera probablement différentes.
Idée originale de http://www.tek-tips.com/viewthread.cfm?qid=1502614&page=9