Quindi, la situazione è la seguente: Negli ultimi due anni, ho implementato una classe in c # che viene utilizzata per filtrare diversi campi da diverse tabelle nel database (SQL), a fini di reporting. Ora vorrei ridurre al minimo il codice e la query, e mi piacerebbe fare le seguenti implementazioni:
1) Tutte le query di base verranno implementate come stored procedure e la clausola "where" più altri filtri verranno passati come un parametro. Fino a qui tutto va bene, dal momento che ho effettuato alcuni test e indipendentemente dalle condizioni che ho inserito (manualmente ovviamente), il parametro è impostato e letto come dovrebbe.
2) Nel codice, vorrei minimizzare il codice, passando i filtri in un singolo array, e quindi il parametro della stored procedure sarebbe una concatenazione di stringa di tutti i valori dell'array. Il pannello dei filtri è composto da 2 caselle di testo (filtro data), 4 caselle di elenco (utente creatore, paese, tipo di cliente (personale, cliente, promozionale ecc.) E prodotto) che ovviamente hanno la possibilità di scelte multiple e un controllo box list (che determina se il client è stato bannato o meno dal servizio). L'elenco check-box ha anche la possibilità di scelta multipla. Per essere più chiaro, implemento la ricerca listbox come segue:
public static String Country_Where_ListBox(ListBox ListBox1)
{
List<string> result = new List<string>();
string value = "";
int j;
for (int i = 0; i < ListBox1.Items.Count; i++)
{
if (ListBox1.Items[i].Selected)
result.Add(ListBox1.Items[i].Text);
}
if ((result.Count == 0) || (ListBox1.SelectedItem.Text == "All"))
value = "";
else
{
value = "and (login.country='" + result[0] + "'";
for (j = 1; j < result.Count; j++)
{
value += " or login.country = '" + result[j] + "'";
}
value += ")";
}
return value;
}
La stessa logica è valida per le altre caselle di elenco. Per l'elenco delle caselle di controllo l'implementazione è la seguente:
public static String Where_CheckboxList(CheckBoxList chL)
{
List<String> list = new List<String>();
string value = "";
for (int i =0; i< chL.Items.Count;i++)
{
if (chL.Items[i].Selected)
{
list.Add(chL.Items[i].Text);
}
}
if (list.Count == 2 || list.Count == 0)
{ value = ""; }
else
{
if (list[0].ToString() == "Locked")
value = " and cte.CC=1 ";
else
value = " and cte.CC>1 ";
}
return value ;
}
E dopo aver eseguito tutti questi calcoli, chiamo l'intera query come segue:
sql = baseSql + QueryManagement.Where_Query(TextBox2, TextBox3, ListBox2, ListBox3, ListBox4, ListBox1);
La mia preoccupazione è che se chiamo questo risultato per riempire l'array (in 3 caselle di elenco faccio scorrere gli elementi per ottenere i risultati), e quindi iterò nuovamente l'array per catturare gli elementi, ci saranno seri problemi di prestazioni , perché circa il 50% dell'intera applicazione Web è costituito da report e filtri come descritto sopra. Esiste qualche pratica migliore in casi simili o esiste un modo per accelerare le prestazioni?