Dependiendo de la implementación específica, tenemos dos enfoques generales para este problema:
1) Cree dinámicamente la declaración de filtro para la consulta SQL en código omitiendo cualquier parámetro que esté vacío. Este es el mejor enfoque si permite que el usuario seleccione varios valores para una sola columna (es decir, seleccione 0 o más de los 50 estados para filtrar los datos).
Por ejemplo:
Asumiendo que txtCondition1 y txtCondition2 son cuadros de texto:
// Assuming conn is an open SqlConnection
System.Text.StringBuilder sbSQL = new StringBuilder(500);
List<SqlParameter> cParameters = new List<SqlParameter>();
// Add a default condition of 1=1 so that all subsequent conditions can be added
// with AND instead of having to check to see whether or not any other conditions
// were added before adding AND.
sbSQL.Append("SELECT * FROM MyTestTable WHERE 1 = 1 ");
if (!String.IsNullOrEmpty(txtCondition1.Text)) {
sbSQL.Append(" AND Column1 = @Column1");
cParameters.Add(new SqlParameter("@Column1", txtCondition1.Text));
}
if (!String.IsNullOrEmpty(txtCondition1.Text))
{
sbSQL.Append(" AND Column2 = @Column2");
cParameters.Add(new SqlParameter("@Column2", txtCondition2.Text));
}
SqlCommand oCommand = new SqlCommand(sbSQL.ToString, conn);
if (cParameters.Count != 0)
{
oCommand.Parameters.AddRange(cParameters.ToArray());
}
// Do something with oCommand
2) Si los valores están más restringidos, generalmente los pasamos a un procedimiento almacenado, que es responsable de determinar si el valor debe evaluarse o no probando el parámetro para "emptinesss", ya sea nulo, cadena vacía, 0 para numéricos , etc.